将 UTF-8 中的 ASCII 文字字符转换为特殊字符
Converting ASCII literal chars on UTF-8 to special chars
我在网上发现了数以千计的类似问题,但 none 其中的问题与我遇到的问题相同。
我正在使用第三方 json 网站 api,但回答的 json 有时包含特殊字符,这些字符在 HTTP
上错误打印
例如:{"message": "Usu\u00e1rio n\u00e3o encontrado", "status": "fail"}
应该是:{"message": "Usuário não encontrado", "status": "fail"}
我无法控制后端 api,并且我已尽一切努力告诉服务器回答我 UTF-8
,我的请求有 headers:
Accept: */*;charset=UTF-8
Accept-Charset: UTF-8
但是服务器一直在回答错误的字符...
所以我尝试读取原始 http 响应并自行解码
byte[] temp = resp.errorBody().bytes();
errorResponse = new String(temp);
errorResponse = new String(temp,"UTF-8");
errorResponse = new String(temp,"iso-8859-1");
errorResponse = new String(temp,"US-ASCII");
errorResponse = new String(temp,"windows-1252");
errorResponse = new String(temp,"Windows-1251");
errorResponse = new String(temp,"GB2312");
errorResponse = new String(temp,"ISO-8859-2");
errorResponse = new String(temp,"Windows-1250");
我已经调试了这段代码并检查了新的断言仍然保留了错误的字符。
所以我相信后端服务器会生成一个 iso-8859-1 字符串并在 UTF-8 http body.
上逐字打印
再说一遍:我无法控制后端代码,有什么方法可以在客户端修复此字符串吗?
这只是一个想法,但我的印象是您的服务器实际上发送了这些字符:
\
u
0
0
e
1
而不是“á”。所以我写了下面的原型,我赶紧说这绝对不是生产质量代码。但是,如果将 JSON 从您的服务器输入到它,您能试试看会发生什么吗?
package com.severityone.test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CharTest {
public static void main(final String... args) {
final String json = "{\"message\": \"Usu\u00e1rio n\u00e3o encontrado\", \"status\": \"fail\"}";
final Matcher matcher = Pattern.compile("\\u([0-9a-z]{4})").matcher(json);
final StringBuffer result = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(result, String.format("%c", Integer.valueOf(matcher.group(1), 16)));
}
matcher.appendTail(result);
System.out.println(result.toString());
}
}
程序给出如下结果:
{"message": "Usuário não encontrado", "status": "fail"}
我在网上发现了数以千计的类似问题,但 none 其中的问题与我遇到的问题相同。
我正在使用第三方 json 网站 api,但回答的 json 有时包含特殊字符,这些字符在 HTTP
上错误打印例如:{"message": "Usu\u00e1rio n\u00e3o encontrado", "status": "fail"}
应该是:{"message": "Usuário não encontrado", "status": "fail"}
我无法控制后端 api,并且我已尽一切努力告诉服务器回答我 UTF-8
,我的请求有 headers:
Accept: */*;charset=UTF-8
Accept-Charset: UTF-8
但是服务器一直在回答错误的字符... 所以我尝试读取原始 http 响应并自行解码
byte[] temp = resp.errorBody().bytes();
errorResponse = new String(temp);
errorResponse = new String(temp,"UTF-8");
errorResponse = new String(temp,"iso-8859-1");
errorResponse = new String(temp,"US-ASCII");
errorResponse = new String(temp,"windows-1252");
errorResponse = new String(temp,"Windows-1251");
errorResponse = new String(temp,"GB2312");
errorResponse = new String(temp,"ISO-8859-2");
errorResponse = new String(temp,"Windows-1250");
我已经调试了这段代码并检查了新的断言仍然保留了错误的字符。
所以我相信后端服务器会生成一个 iso-8859-1 字符串并在 UTF-8 http body.
上逐字打印再说一遍:我无法控制后端代码,有什么方法可以在客户端修复此字符串吗?
这只是一个想法,但我的印象是您的服务器实际上发送了这些字符:
\
u
0
0
e
1
而不是“á”。所以我写了下面的原型,我赶紧说这绝对不是生产质量代码。但是,如果将 JSON 从您的服务器输入到它,您能试试看会发生什么吗?
package com.severityone.test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CharTest {
public static void main(final String... args) {
final String json = "{\"message\": \"Usu\u00e1rio n\u00e3o encontrado\", \"status\": \"fail\"}";
final Matcher matcher = Pattern.compile("\\u([0-9a-z]{4})").matcher(json);
final StringBuffer result = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(result, String.format("%c", Integer.valueOf(matcher.group(1), 16)));
}
matcher.appendTail(result);
System.out.println(result.toString());
}
}
程序给出如下结果:
{"message": "Usuário não encontrado", "status": "fail"}