如何解决Apache HTTP 客户端强制使用 UTF-8 编码
我正在使用 org.apache.http
包进行休息调用,如下所示。我希望在回复中提供用户个人资料详细信息,以英语和其他国际语言显示。
HttpGet req = new HttpGet(baseUrl + uri);
HttpResponse res= closeableHttpClient.execute(req);
响应以 UTF-8 作为字符集,这正是我想要的。从这里开始,我使用了 2 种方法来解组对地图的响应。
方法一:
String response = EntityUtils.toString(res.getEntity(),"UTF-8");
// String response = EntityUtils.toString(httpResponse.getEntity(),Charset.forName("UTF-8"));
map = jsonConversionUtil.convertStringtoMap(response);
问题:
httpResponse.getEntity()
正在返回 StringEntity
对象,该对象的默认字符集为 ISO_8859_1,但即使我强制转换为 UTF-8(上面的未注释行和注释行,我都尝试过),我无法覆盖为 UTF-8。
方法 2:
HttpEntity responseEntity = res.getEntity();
if (responseEntity != null ) {
InputStream contentStream = responseEntity.getContent();
if (contentStream != null) {
String response = IOUtils.toString(contentStream,"UTF-8");
map = jsonConversionUtil.convertStringtoMap(response);
}
}
问题:
IOUtils.toString(contentStream,"UTF-8");
未设置为 UT8。
我使用的是 httpclient 4.3.2 jar 和 httpcore-4.3.1 jar。 Java 6 中使用的 Java 版本。我无法升级到更高的 Java 版本。
能否请您指导我如何设置为 UTF-8 格式。
解决方法
如果 StringEntity
对象具有 ISO-8859-1 编码,则服务器返回其响应编码为 ISO-8859-1。您认为“响应使用 UTF-8 作为字符集” 的假设很可能是错误的。
由于它是 ISO-8859-1,所以您的两种方法都不起作用:
-
方法 1:
"UTF-8"
参数无效,因为该参数指定了默认编码,以防服务器未指定编码(请参阅 EntityUtils.toString()。但是服务器明显指定了一个。 -
方法 2:将二进制内容读取为 UTF-8,实际上是用 ISO-8859-1 编码的,可能会导致垃圾(尽管许多字符具有类似的表示)在 UTF-8 和 ISO-8859-1 中)。
所以尝试要求服务器返回UTF-8:
HttpGet req = new HttpGet(baseUrl + uri);
req.addHeader("Accept","application/json");
req.addHeader("Accept-Charset","utf-8");
HttpResponse res = closeableHttpClient.execute(req);
如果它忽略指定的字符集并仍然返回 ISO-8859-1 中的 JSON,那么它将无法使用 ISO-8859-1 范围之外的字符(除非它在 JSON 中使用转义)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。