`
bazhuang
  • 浏览: 147164 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

HttpURLConnection乱码问题解决

    博客分类:
  • java
阅读更多
今天要完成一个程序,要通过后台访问另外一个服务,中间需要传递一个姓名过去,就产生了乱码问题,源代码如下:
			String data = "&version=140410&inputCharset=1&signType=1&merchantMbrCode=10000135&serviceCode=101&requestId=10000135_1217843792221&requestTime=20080804175632&bankId=ICBC&bankAcctName=陈寄文&bankAcctId=45120&idType=101&idNumber=410230197701214512&ext1=&ext2=&signMsg=null";

			System.out.println(data);
			URL url = new URL("http://localhost/bankcardcert/bankCardValidate.htm");
			StringBuffer bankXmlBuffer = new StringBuffer();
			//创建URL连接,提交到银行卡鉴权,获取返回结果
			HttpURLConnection connection = (HttpURLConnection) url.openConnection();
			connection.setRequestMethod("GET");
			connection.setDoOutput(true);
			connection.setRequestProperty("User-Agent", "directclient");
			PrintWriter out = new PrintWriter(connection.getOutputStream());
			out.println(data);
			out.close();
			BufferedReader in = new BufferedReader(new InputStreamReader(connection
					.getInputStream()));

			String inputLine;

			while ((inputLine = in.readLine()) != null) {
				bankXmlBuffer.append(inputLine);
			}
			in.close();
			System.out.println(bankXmlBuffer.toString());

在这里我会告诉那个程序我传递过去的编码是UTF-8,但那边按照UTF-8对姓名进行转码时,出现的确实乱码,基本上都是乱七八糟的东东。

问题肯定是出在并没有告诉它我传递的是UTF-8,我就试着把data转为iso-8859-1编码,似乎也不太行。
data = new String(data.getBytes("utf-8"), "iso-8859-1");

同样也是乱码。

找了一下资料,后来终于找到原因了,需要修改一下这里:
PrintWriter out = new PrintWriter(new OutputStreamWriter(connection.getOutputStream(),"utf-8"));

这样就可以告诉它我传递过去的是utf-8了,那个new String的转码也就不需要了。

后续程序中处理中文姓名的地方如下:
		// 银行账户名称
		String bankAcctName = bccMerchantReqDto.getBankAcctName();
		String inputCharset = bccMerchantReqDto.getInputCharset();
		if (StringUtils.isEmpty(bankAcctName)) {
			throw VerifyRequestErrorFactory.create(
					BccRequestErrorCode.BANKACCTNAME_ERROR.getValue(),
					"银行账户名称不能为空");
		}
		
		bankAcctName = BccEncodingUtil.parseString(bankAcctName, inputCharset);//按照编码将账户名称转换为指定编码
		bccMerchantReqDto.setBankAcctName(bankAcctName);
		String pattern = "[\u4E00-\u9FFF\u00B7]{0,16}";
		if(!Pattern.matches(pattern, bankAcctName)){
			throw VerifyRequestErrorFactory.create(
					BccRequestErrorCode.BANKACCTNAME_ERROR.getValue(),
					"银行账户名称必须为中文字,当前设置的名称为:"+bankAcctName);
		}

BccEncodingUtil.parseString这个方法就是按照我传递过去的inputCharset对bankAcctName进行转码,这样在这个程序中处理的话就再也不会出现乱码了。
分享到:
评论
9 楼 luliangy 2015-01-27  
我是直接放在URL里面的出了错,试了下放在data里面就没问题了
8 楼 luliangy 2015-01-27  
我是在服务端(webx)getBytes iso8895-1然后utf-8转string得到中文,你的这个方法还是有问题
7 楼 cwalet 2013-04-19  
bazhuang 写道
liwanfeng 写道
data = new String(data.getBytes(), "utf-8");  

我采用的是这种办法,的确可以出现中文,不过当中文和英文交接的位置,则会出现乱码!而且显示的都是“???”,怎么解决?

用这种办法不会出现同样的问题吗?
PrintWriter out = new PrintWriter(new OutputStreamWriter(connection.getOutputStream(),"utf-8"));  

这种方式就是告诉对方,我传递的编码是UTF-8的,对方获取这个参数的时候不会出现问题,如果还是有乱码的问题,可以使用httpClient,使用PostMethod处理


我的问题不是传入data编码不一致,而是返回数据编码不一致,经本文提醒,改
new InputStreamReader(url.openStream(), "UTF8");

即可。之前尝试使用new String()的方法亦得到半中文半问好的结果,百思不得其解~
6 楼 cl1154781231 2012-10-11  
connection.getOutputStream(),"utf-8");确实可以,谢谢。
5 楼 bazhuang 2010-06-19  
liwanfeng 写道
data = new String(data.getBytes(), "utf-8");  

我采用的是这种办法,的确可以出现中文,不过当中文和英文交接的位置,则会出现乱码!而且显示的都是“???”,怎么解决?

用这种办法不会出现同样的问题吗?
PrintWriter out = new PrintWriter(new OutputStreamWriter(connection.getOutputStream(),"utf-8"));  

这种方式就是告诉对方,我传递的编码是UTF-8的,对方获取这个参数的时候不会出现问题,如果还是有乱码的问题,可以使用httpClient,使用PostMethod处理
4 楼 liwanfeng 2010-06-18  
data = new String(data.getBytes(), "utf-8");  

我采用的是这种办法,的确可以出现中文,不过当中文和英文交接的位置,则会出现乱码!而且显示的都是“???”,怎么解决?

用这种办法不会出现同样的问题吗?
PrintWriter out = new PrintWriter(new OutputStreamWriter(connection.getOutputStream(),"utf-8"));  
3 楼 daphlylover 2009-12-16  
提交获取或出现部分乱码,,,什么原因??
2 楼 guoxa2003 2009-09-15  
获益良多,问题解决了,真心感谢!希望能再多见到这么有见地的帖子。
1 楼 hhz0422 2009-01-12  

相关推荐

Global site tag (gtag.js) - Google Analytics