【问题标题】:How to handle character encoding in spring RestController如何在 Spring RestController 中处理字符编码
【发布时间】:2018-10-24 16:04:28
【问题描述】:

我正在尝试在RestController 中查找有关如何处理字符编码的信息。

Spring 似乎完全忽略了Content-Type 标头中发送的字符集。无论使用此标头将哪个字符集发送到服务器,服务器都会尝试将其读取为 UTF-8 并使用字符集 UTF-8 发送响应。

这是一个 GitHub 存储库,其中包含重现此场景的演示:https://github.com/hawk1234/characterEncodingTest

有人可以指出春季文档中描述的位置吗?我遇到了内容协商,但我认为它更多的是关于响应格式而不是编码。

2018 年 11 月 1 日更新

我已经实施了一些测试以更好地显示问题所在。提交 86dc434351d7ee2c142afc8f389e7837810b19f6 包括 EncodingTest 类,它使用不同的编码测试端点。

我还实现了我的编码处理(提交 a26c5da0b25fba8a40e3be41e96​​7e6b1e5c4d546),但它是非常基本的实现,可能不会考虑所有情况。我仍在寻找使用现有库的更简单的解决方案。

【问题讨论】:

  • 当前的 JSON RFC 需要 UTF-8。您宁愿 400 或 406 忽略字符集吗? (我不是 Spring 用户,所以我无法在这种情况下做出回应。)你为什么不想使用 UTF-8?
  • @TomBlodget 一旦你使用任何非英文字符,UTF-8 就会成为障碍。 UTF-16 在这方面可能会更好,但有些特定情况是 UTF 无法处理的。

标签: java spring http spring-boot character-encoding


【解决方案1】:

默认 charset 是 UTF-8,MappingJackson2HttpMessageConverter 是管理 charSet 的人。您可以通过实现 bean 并将 charSet 设置为 null 来覆盖。

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    jsonConverter.setObjectMapper(objectMapper);
    jsonConverter.setDefaultCharset(null);
    return jsonConverter;
}

我在您的存储库pullRequestCharacterEncoding 上创建了一个包含这些更改的拉取请求,并且运行良好。 亲切的问候。

【讨论】:

  • 不幸的是,您的解决方案似乎不起作用。我添加了检查端点是否有不同编码的测试(提交 86dc434351d7ee2c142afc8f389e7837810b19f6)
  • 我想得到我的赏金xD
  • @JonathanJohx:我也认为 Jackson 是负责处理编码的组件。然而,据我所知,Jackson 仅支持 Unicode 编码(UTF-8、UTF-16 等)。为了让它读取其他编码,您需要覆盖更多代码并使用 Reader 实例对其进行初始化,这样它就不再对编码做任何事情了。
【解决方案2】:

请在您的请求中尝试以下操作:

Accept-Charset: <US-ASCII or any charset you want to set>

请查看以下链接了解更多详情:

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Charset

如果它适合你,请告诉我

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-31
    • 2014-09-02
    • 1970-01-01
    • 2016-04-24
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    相关资源
    最近更新 更多