案例描述
使用包org.apache.http.*,http post请求接收端使用UTF-8编码,接收时没有对编码做任何处理,结果乱码,情况要求发送端(也就是我们的业务系统)做调整,解决乱码问题。
解决方案
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(host);
httpPost.setEntity(new UrlEncodedFormEntity(List<NameValuePair>,"UTF-8"));
延伸解读
new UrlEncodedFormEntity(nvps,”UTF-8”) 源码:
public UrlEncodedFormEntity (
final List <? extends NameValuePair> parameters,
final String charset
) throws UnsupportedEncodingException {
super(
URLEncodedUtils.format(
parameters,charset != null ?
charset : HTTP.DEF_CONTENT_CHARSET.name()
),
ContentType.create(URLEncodedUtils.CONTENT_TYPE, charset)
);
}
public static final Charset DEF_CONTENT_CHARSET = Consts.ISO_8859_1;
可以看到,post请求如果不设置编码的情况下默认编码是 ISO_8859_1
小结
在默认情况下(假设发送端和接收端系统都使用UTF-8编码),是会有乱码问题的,此时解决方案有两种:
发送端通过
httpPost.setEntity(new UrlEncodedFormEntity(nvps,"UTF-8"))
设置UTF-8编码接收端接收ISO_8859_1编码的数据,然后将它转换成UTF-8编码的数据。