2

我正在关注Unicode - 如何正确输入字符?邮政。

我唯一的问题是 JSONObject 编码(我正在使用org.jsonlib)。

例如,当我将类似的字符串放入àòùè쀀JSONObject 时,就会出现问题。

System.out.println(entry.getValue());
JSONObject temp = new JSONObject();
temp.put("values", entry.getValue();
System.out.println(temp.toString());

我得到àòùè쀀and{"values":"àòùèì\u20ac\u20ac"}而不是{"values":"àòùè쀀"}.

编辑

通过从哈希表传递到 jsonObject,使用了扩展的 utf-8 编码。例如,哈希表

 {€èòàùì€ù=èòàù€ì, €òàèùì€=èòàù€ìç§$}

成为 JSONObject

 {"\u20acòàèùì\u20ac":"èòàù\u20acìç§$","\u20acèòàùì\u20acù":"èòàù\u20acì"}
4

1 回答 1

2

它们完全相等,Unicode 转义占用了更多空间。就像\u004a用 Java 写东西和写东西完全一样a。如果正确性是您关心的问题,那没关系。

除非您的大部分文本在 0x2000 - 0x20FF 之间,否则它也不会占用大量额外空间:

以下代码转义了 C0 和 C1 控制字符,但也转义了 0x2000 - 0x20FF:

     if (c < ' ' || (c >= '\u0080' && c < '\u00a0')
                    || (c >= '\u2000' && c < '\u2100')) {

因此 0x2000 - 0x20FF 和控制字符之间的任何字符都表示为 unicode 转义。这对于控制字符是有意义的,因为在 JSON 中不允许以未转义的形式出现这些字符。

至于0x2000 - 0x20FF,我不知道,因为代码没有注释。在该范围内未转义的每个字符都是有效的 JSON。当然,0x2028并且0x2029在 Javascript 中无效(因此这个小细节使 JSON 语法不是 Javascript 语法的子集),因此最好在 JSON 中转义这些语法,以防它被用作 JSONP,它确实是 Javascript。但我不清楚为什么代码会转义整个范围,因为该范围内只有 2 个字符是非法的。

于 2013-04-09T09:48:55.047 回答