为什么在这两种情况下unicode编码不同?

时间:2019-11-18 05:49:56

标签: java spring-mvc unicode jackson unicode-escapes

我已经写了这个最小的例子:

public static class X {
    private String x;

    public String getX() {
        return x;
    }

    public void setX(String x) {
        this.x = x;
    }

    public X(String x) {
        super();
        this.x = x;
    }

}
@RequestMapping(value = "/unicode.test1", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String unicodeTest1() {
    return "{\"x\":\"X\u00ADX\"}";
}
@RequestMapping(value = "/unicode.test2", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public X unicodeTest2() {
    return new X("X\u00ADX");
}

为什么两个端点都返回不同的结果?

enter image description here

更重要的是,根据2019年的标准和最佳实践,这两个结果中的哪个是严格正确的?

标题

C:\>curl -i "http://localhost/rets_api/unicode.test1"
HTTP/1.1 200
Content-Type: application/json;charset=ISO-8859-1
Content-Length: 11
Date: Mon, 18 Nov 2019 06:24:01 GMT

{"x":"X¡X"}
C:\>curl -i "http://localhost/rets_api/unicode.test2"
HTTP/1.1 200
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Mon, 18 Nov 2019 06:24:05 GMT

{"x":"X­X"}

1 个答案:

答案 0 :(得分:2)

在第一种情况下,Spring使用默认字符集(ISO-8859-1),在第二种情况下,当Spring负责JSON序列化时,使用UTF-8。

来自RFC

  

JSON文本应以UTF-8,UTF-16或UTF-32编码。默认
  编码为UTF-8,并且以UTF-8编码的JSON文本为
  从某种意义上说,它们可以互操作,   最大实施次数;有很多实现方式
  无法成功读取其他编码(例如
  UTF-16和UTF-32)。

您可以使用produces = MediaType.APPLICATION_JSON_UTF8_VALUE或通过配置操作系统来明确指定UTF-8。