最近打算写一个简单的javaweb程序放到BAE3.0上来响应android的请求,多线程读取网络上的json数据然后解析出有用的数据在合并成新的json对象。
结果服务器返回json对象时发现其中的中文变成了乱码了都是????。
设置response.setContentType("text/json;charset=UTF-8");或者
response.setContentType("text/json");response.setCharacterEncoding("UTF-8");
都还是输出的中文显示乱码。经过调试发现是读取网络上的json时就是乱码了。
把代码js = new String(baos.toByteArray());修改成js = baos.toString("UTF-8");读取的json就能正常显示中文了。
// 根据传进来的网址读取JSONpublic String getJsonString(String path) { String js = ""; ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 建立一个byte数组作为缓冲区,等下把读取到的数据储存在这个数组 try { byte[] buffer = new byte[1024]; int len = 0; URL url = new URL(path); HttpURLConnection huc = (HttpURLConnection) url.openConnection(); huc.setRequestMethod("GET"); huc.setReadTimeout(6000); huc.setConnectTimeout(3500); InputStream ips = huc.getInputStream(); while ((len = ips.read(buffer)) != -1) { baos.write(buffer, 0, len); } js = baos.toString("UTF-8"); baos.close(); } catch (ProtocolException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return js;}
结果返回数据的时候发现用response.getWriter().write(getJsonString(match_id));返回的数据里中文还是显示乱码.
但是修改成response.getWriter().print(getJsonString(match_id));以后就正常显示中文了。
查了下发现print方法会自动的把字符转换成字节,用的编码是平台的默认编码。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/json"); response.setCharacterEncoding("UTF-8"); String number = request.getParameter("number"); if (match_id != null && !match_id.isEmpty()) { //response.getWriter().write(getJsonString(match_id)); response.getWriter().print(getJsonString(match_id)); }}
如果是选择字节流输出则用:response.getOutputStream().write(getJsonString(match_id));
或者response.getOutputStream().print(getJsonString(match_id).getBytes("UTF-8"));都能正常显示中文。