【问题标题】:Why does my code return unicode characters?为什么我的代码返回 unicode 字符?
【发布时间】:2018-10-22 18:54:32
【问题描述】:
String encodedInputText = URLEncoder.encode("input=" + question, "UTF-8");
            urlStr = Parameters.getWebserviceURL();
            URL url = new URL(urlStr + encodedInputText + "&sku=" + sku);
            BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
            jsonOutput = in.readLine();
            in.close();

问题是返回的 JSON 字符串包含所有 unicode,如

"question":"\u51e0\u5339\u7684",

不是真正的汉字。 “UTF-8”应该可以解决问题。为什么不呢?

编辑:

ObjectMapper mapper = new ObjectMapper();
ResponseList = responseList = mapper.readValue(jsonOutput, ResponseList.class);

【问题讨论】:

  • 为什么要 UTF-8 解决问题?
  • 首先,您正在对整个键值对进行编码,而不是仅对值进行编码,这可能是不正确的。关于您的问题,我们不知道为什么暴露未知 API 的未知服务器会返回它返回的内容。
  • 除了编码 请求 URL 与响应格式无关之外,您的响应完全符合 UTF-8:反斜杠 u , 和十六进制数字都是有效的 UTF-8 字符。无论 JSON 的字符集如何,转义序列都是完全有效的 JSON。

标签: java url inputstreamreader


【解决方案1】:

这不是编码的问题,是你的数据源的问题。当您将字节转换为字符串时,编码就会发挥作用。您希望编码将 \uxxxx 形式的字符串转换为另一个字符串,这不会发生。

重点是,数据源正在以这种方式序列化数据,因此您的原始数据已经消失并被 \uxxxx 替换。

现在您必须手动捕获 \uxxx 序列并将其转换为实际字符。

【讨论】:

  • 您的意思是从 Web 服务 URL 获取的输入值损坏了?
  • 正确的 JSON 解析器会自动将 unicode 转义序列转换为字符。完全不需要手动捕获转义序列并进行转换。
  • @JBNizet,请看我的版本。您是否建议使用对象映射器之类的东西?我正在使用“com.fasterxml.jackson”
  • 是的,例如。使用 Jackson 解析 JSON 会将 unicode 转义序列转换为相应的中文字符。
  • 好的。我在使用映射器时遇到了另一个问题。我要写另一个故事了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 2021-07-17
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多