将 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"}