HttpClient使用post和get时Json中文乱码解决方案

深夜了,一个人还是抽时间把今天遇到的问题记录下来。今天遇到一个比价麻烦的问题就是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端得到的中文就不再是乱码了。

总体来说,是一个思想,编码和解码都必须要使用同一个码制,这是一个基本原则,很容易理解。

写下来,挖坑,自己跳.........哎,出来码总是要还的啊,基础薄弱,也是醉了......



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值