深夜了,一个人还是抽时间把今天遇到的问题记录下来。今天遇到一个比价麻烦的问题就是Java中的字符串编码问题,没有了解编码的本质,解决问题无从下手,哎,基础知识不够的话,迟早是要还的。看到这篇文章的你,想必感同身受吧。
我遇到的问题是当HttpClient使用调用Tomcat中运行的servlet的时候,无论是get还是post方法,都出现了中文乱码。
网上说的天花烂坠,但是都没有真正的解决我的问题。
下面来看看servlet端的doPost方法:
// post响应
req.setCharacterEncoding("UTF-8"); // 转码
System.out.println(req.getMethod());
System.out.println(req.getContentType().toString());
String requestJson = "";
// 获取post请求的输入流读取器
// 以流的形式接受上来的数据,并指定编码方式============================================
BufferedReader br = new BufferedReader(new InputStreamReader(
(ServletInputStream) req.getInputStream(), "UTF-8"));
// ===========================================================================
// 将输入流转换成字符串
StringBuffer sb = new StringBuffer();
String temp;
while ((temp = br.readLine()) != null) {
sb.append(temp);
}
br.close(); // 关闭读取器
requestJson = sb.toString();
注意看,对post请求req进行了转码,但是事实上并没有起太大的作用,实验结果表明如此,真正起作用的是红色部分字体,对于post方法而言,最直接的办法是将请求以UTF-8的码制转为输入流对象,而后再转换回来成为String。
其实,最麻烦的是get方法,我按照post方法中的处理办法如法炮制,还是不行,估计是由于方法本身有区别的原因。网上找了很多资料,也没搞太清楚,但是最终还是找到了一个最有效的办法。
android端代码如下:
HttpGet httpGet = new HttpGet(urlBikeInfoUpdate);
try {
// 创建http请求客户端
DefaultHttpClient httpClient = new DefaultHttpClient();
// 执行httpGet请求
<span style="color:#33cc00;">HttpResponse response = httpClient.execute(httpGet);</span>
// 测试网络是否通顺
if (DEBUG) {
..........
} else {
// 获取请求得到的实体
HttpEntity entity = response.getEntity();
// 这里得到的result字符串已经中文乱码了
String result = EntityUtils.toString(entity);
// 解码
result = URLDecoder.decode(result, "UTF-8");
hSetText.obtainMessage(quaryUserInfoOk, result)
.sendToTarget();
// debugString = URLDecoder.decode(result, "UTF-8");
// hSetText.obtainMessage(debugMsg).sendToTarget();
}
// outText.setText(entity.getContent().toString());
Log.d(TAG, "you have click the button");
} catch (Exception e) {
hSetText.obtainMessage(sendFailed, e.toString()).sendToTarget();// 获取图片失败
return;
}
}
获取get响应。我查看了一下,其实这部分得到的字符串中文已经处于乱码状态,所以,不要考虑其他的了,要么是doGet发过来码制不对,就是没有合理解码。
接下来,我们看看servlet端的doGet代码:
PrintWriter out = resp.getWriter();
// -----------------------------------------------------
StringWriter stringWriter = new StringWriter();
// 将objArray作为String形式写入写入stringWriter
objArray.writeJSONString(stringWriter);
String jsonText = stringWriter.toString();
// 编码
jsonText = URLEncoder.encode(jsonText, "UTF-8");
System.out.println(jsonText);
// 发送响应
out.print(jsonText);
这里是修改正确之后的代码,加上这一句,和android端的紫色字体部分形成编码---解码的接口对应。
这样,android端得到的中文就不再是乱码了。
总体来说,是一个思想,编码和解码都必须要使用同一个码制,这是一个基本原则,很容易理解。
写下来,挖坑,自己跳.........哎,出来码总是要还的啊,基础薄弱,也是醉了......