【问题标题】:Unicode Characters appearing as Question Marks in Java JSON ParsingUnicode 字符在 Java JSON 解析中显示为问号
【发布时间】:2012-08-05 18:28:40
【问题描述】:

过去几天我一直在搜索这个,但我认为我找不到正确的指针。如果发现重复,请将其与相应的问题合并。

我对使用 JSON 很陌生,作为我的一个项目的一部分,我需要解码 JSON 文件并对其进行进一步处理。然而,当我尝试使用 Json-simple 库进行解码时,我在解析的对象中得到了一些奇怪的问号,而不是实际的字符。示例代码如下所示:

String str = "{\"alias\": [\"Evr\u00f3pa\", \"\u05d0\u05d9\u05e8\u05d5\u05e4\"]}";
JSONParser parser = new JSONParser(); 
JSONObject jsonObject = (JSONObject)parser.parse(str);

System.out.println(jsonObject) gives {"alias":["Evrópa","?????"]}

我也尝试使用 Json-lib,结果相同。

感谢您的帮助。

【问题讨论】:

标签: java json unicode


【解决方案1】:

问题不在于您的 JSON,而在于您的 System.out.println()。这些字符无法在终端(或 IDE,如果您在其中运行)的字符编码或 System.out 在您的环境中使用的编码中表示。

文件不能包含 Unicode 字符。文件是 bytes 的流,但 Unicode characters 是多个字节(通常是两个)的大小。这就是字符编码变得相关的地方。 Unicode 字符必须转换为字节序列才能将它们写入文件(包括 System.out)。 Unicode 字符最常用的编码之一是 UTF-8。软件程序员的诀窍是在字节和字符之间转换时始终使用正确的字符编码。在一个地方缺少正确的编码,例如在调试 println() 调用中,会产生错误和误导性的输出。

【讨论】:

  • 为了确保不是这种情况,我已经尝试编写我解析的同一个对象,回到一个文件中,我以前在我的编辑器中作为代码可见的 unicode 字符现在在同一个编辑器。所以我想这可能是解析或字符编码的问题。
  • 可能您在将字符写入文件时未正确编码字符,和/或您的编辑器在读取文件时未使用相同的编码。我刚刚使用 Python 快速测试了您的 JSON(它比使用 Java 测试更快)并且数据很好。看起来字符是希伯来语,我认为
  • 好的,我刚刚使用 Java(OpenJDK 1.6.0,使用 libjson-simple-java 库)对其进行了测试,它运行良好。我的环境包含 LANG=en_US.UTF-8;我的 gnome-terminal 同样设置为 UTF-8。
  • 嗨,dsh,正如您所指出的,我的 IDE 的字符编码存在问题,默认设置为本机操作系统的编码。现在一切都安排好了。再次感谢。
【解决方案2】:

您可能正在使用不支持特殊字符组的默认字符集。尝试使用 UTF-8 作为您的字符集,类似于以下内容:

String str = "{\"alias\": [\"Evr\u00f3pa\", \"\u05d0\u05d9\u05e8\u05d5\u05e4\"]}";
InputStreamReader isr = new InputStreamReader(new ByteArrayInputStream(str.getBytes(Charset.forName("UTF-8"))), Charset.forName("UTF-8"));
JSONParser parser = new JSONParser(); 
JSONObject jsonObject = (JSONObject)parser.parse(isr);

【讨论】:

  • 数据已经是一个包含 unicode 字符的字符串。无需将其编码为字节,然后将字节解码回字符串。
  • 我觉得 dsh 说的是对的。还研究了一些可能是因为我们的解析器将 unicode 编码转换为其他编码,然后当目标编码不支持某些字符时,它们被转换为问号。
猜你喜欢
  • 2013-10-22
  • 2015-05-09
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
相关资源
最近更新 更多