Apache HTTP 客户端强制使用 UTF-8 编码
Apache HTTP Client forcing UTF-8 encoding
我正在使用 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。
方法二:
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 中使用的版本 Java 6. 我无法升级到更高的 java 版本。
能否指导我如何设置为 UTF-8 格式。
如果 StringEntity
对象具有 ISO-8859-1 编码,则服务器已 return 将其响应编码为 ISO-8859-1。您假设 “响应具有 UTF-8 作为字符集” 很可能是错误的。
因为它是 ISO-8859-1,所以您的两种方法都不起作用:
方法 1:"UTF-8"
参数无效,因为该参数指定了默认编码,以防服务器未指定编码(看到EntityUtils.toString()。但是服务器显然指定了一个。
方法 2:将二进制内容读取为 UTF-8,实际上是用 ISO-8859-1 编码的,可能会导致垃圾(尽管许多字符在 UTF-8 和 ISO-8859-1 中具有相似的表示形式。
所以尝试要求服务器 return UTF-8:
HttpGet req = new HttpGet(baseUrl + uri);
req.addHeader("Accept", "application/json");
req.addHeader("Accept-Charset", "utf-8");
HttpResponse res = closeableHttpClient.execute(req);
如果忽略指定的字符集,仍然returns JSON ISO-8859-1,那么它将无法使用ISO-8859-1范围之外的字符(除非它在 JSON).
中使用转义
我正在使用 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。
方法二:
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 中使用的版本 Java 6. 我无法升级到更高的 java 版本。
能否指导我如何设置为 UTF-8 格式。
如果 StringEntity
对象具有 ISO-8859-1 编码,则服务器已 return 将其响应编码为 ISO-8859-1。您假设 “响应具有 UTF-8 作为字符集” 很可能是错误的。
因为它是 ISO-8859-1,所以您的两种方法都不起作用:
方法 1:
"UTF-8"
参数无效,因为该参数指定了默认编码,以防服务器未指定编码(看到EntityUtils.toString()。但是服务器显然指定了一个。方法 2:将二进制内容读取为 UTF-8,实际上是用 ISO-8859-1 编码的,可能会导致垃圾(尽管许多字符在 UTF-8 和 ISO-8859-1 中具有相似的表示形式。
所以尝试要求服务器 return UTF-8:
HttpGet req = new HttpGet(baseUrl + uri);
req.addHeader("Accept", "application/json");
req.addHeader("Accept-Charset", "utf-8");
HttpResponse res = closeableHttpClient.execute(req);
如果忽略指定的字符集,仍然returns JSON ISO-8859-1,那么它将无法使用ISO-8859-1范围之外的字符(除非它在 JSON).
中使用转义