如题,HttpURLConnection使用POST方法发起http请求,参数通过form来传递(并非使用URL传递参数),出现了中文乱码的情况。
具体描述为:将请求参数以
Content-Disposition: form-data; name="name" value
形式上传,然后使用OutputStream.write传送,结果中文参数会出现乱码。
因为调用的方法是另外的人开发的系统,他们设定了通过UTF-8解码读取,所以要求调用时使用UTF-8进行编码后才可进行。
百度谷歌了一下解决方法,有教charset设置UTF8的,如
HttpURLConnection conn = null; conn.setRequestProperty("Content-Type", "multipart/form-data; charset=UTF-8; ");
也有很复杂的,每次参数拼接都设定编码的,如
// 首先组拼文本类型的参数 StringBuilder sb = new StringBuilder(); for (Map.Entry<String, String> entry : params.entrySet()) { sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINEND); sb.append("Content-Disposition: form-data; name="" + entry.getKey() + """ + LINEND); sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND); sb.append("Content-Transfer-Encoding: 8bit" + LINEND); sb.append(LINEND); sb.append(entry.getValue()); sb.append(LINEND); }
但是,这些方法都试用遍了,还是没有起效。
后来我通过这样,解决了问题:
StringBuffer strBuf = new StringBuffer();
strBuf.append("Content-Disposition: form-data; name=""
+ name+ ""
");
strBuf.append(value);
out.write(strBuf.toString().getBytes("UTF-8"));
代码不是完整的。不过做法是很简单的。只需保持原本StringBuffer将参数的key和value拼接在Content-Disposition: form-data; name=的过程,最后,out.write一个byte[]时,保证这个参数byte[]数组是UTF-8编码。原来的String.getBytes()换成String.getBytes("UTF-8")即可!
有类似疑难的情况,可以这样解决!