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