【发布时间】:2018-10-09 14:07:12
【问题描述】:
我正在使用一个以 UTF-8 编码德语变音符号的 API。我的应用程序需要对这些字符进行解码和编码。编码不是问题,完全可以正常工作。为了实现这一点,我在创建新的StringEntity 时设置了一个字符集,并将其添加到请求中,如下所示:
HttpPost request = new HttpPost(getUrl);
if(useProxy) {
RequestConfig config = RequestConfig.custom()
.setProxy(proxy)
.build();
request.setConfig(config);
}
request.addHeader("APIKey", apiKey);
request.addHeader("Accept", "application/json");
request.addHeader("Content-type", "application/json; charset=UTF-8");
request.setEntity(new
StringEntity(JsonUtils.getJsonFromObject(nachricht), "UTF-8"));
所有特殊字符(如元音变音)都会正确发送并存储在后端。 但是,当我想检索这些数据时,它会导致一些如下所示的错误:
小字符有效,但大写字母无效。似乎响应或 HTTPGET 请求是 ISO_8859_1 编码的。如何将 HTTPGET 的字符集设置为 UTF-8?我已经尝试像这样设置请求标头:
request.addHeader("Content-type", "application/json; charset=UTF-8");
并像这样解码响应的内容:
byte[] bytes = EntityUtils.toString(responseEntity).getBytes();
String responseString = new String(bytes, "UTF-8");
但由于响应的字符集似乎是错误的,使用 UTF-8 解码会导致错误..
【问题讨论】:
-
如果不是最初的“T”,似乎还有一个错误的小写转换。首先转储java字符串的字符的int值并检查它们。也许“大写”是高 Unicode 范围内的小写字母。
-
只是变音符号转换错误,我的屏幕截图中损坏的字母是 Ö、Ä 和 Ü,而 ö、ä 和 ü 正常工作..
-
我打赌
é和÷(\u00F7) 也可以,但É不行。它必须是java部分。也许有一个 validation 有一个正则表达式列表äöüß但不是ÄÖÜ。 Amd 不知何故 - 由于 UTF-8 可以处理所有 Unicode - 必须发生转换/替换才能接收 ?-placeholder -
其他可能性,相当遥远:一些转换为 Latin-1,加上大写字母不是从德语键盘获取的,而是从字符映射应用程序中错误选择的:
ȀŐŰ。在每种情况下,最好在 java 中转储值;这确保它们从数据库中正确读取(MySQL 以其额外的使用Unicode URL 而闻名)。s = s.replaceAll("\\p{ASCII}", mr -> mr.group() + Arrays.toString(mr.group().codePoints().toArray()))
标签: java api utf-8 apache-httpclient-4.x