HttpURLConnection乱码问题解决

今天要完成一个程序,要通过后台访问另外一个服务,中间需要传递一个姓名过去,就产生了乱码问题,源代码如下:

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进行转码,这样在这个程序中处理的话就再也不会出现乱码了。

你可能感兴趣的:(java)