Apache HTTP客户端强制UTF-8编码



我使用org.apache.http包进行休息调用,如下所示。我期待在英语和其他国际语言的回复中提供用户资料详细信息。

HttpGet req = new HttpGet(baseUrl + uri);
HttpResponse  res= closeableHttpClient.execute(req);

响应有UTF-8作为字符集,这是我想要的。从这里开始,我使用了两种方法来分解对映射的响应。

方法1:

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中使用转义)。

最新更新