Unicode字符在Java JSON解析中显示为问号

时间:2012-08-08 15:30:27

标签: java json unicode

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

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

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,结果相同。

感谢您的帮助。

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:0)

您可能正在使用不支持特殊字符组的默认字符集。尝试使用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);