org.json中的JSONObject:utf-8编码问题

时间:2013-04-09 07:19:32

标签: json encoding utf-8 org.json

我正在关注Unicode - How to get the characters right?帖子。

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

当我在JSONObject中放置像àòùè쀀之类的字符串时会出现问题。

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

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

修改

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

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

成为JSONObject

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

1 个答案:

答案 0 :(得分:2)

它们完全相同,Unicode转义占用更多空间。就像在Java中编写\u004a一样,与编写a完全相同。如果你关注的是正确性,那也没关系。

除非你的大部分文字介于0x2000 - 0x20FF之间,否则它不会占用相当多的额外空间:

The following code转义C0和C1控制字符,但它也转义为0x2000 - 0x20FF:

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

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

对于0x2000 - 0x20FF,我不知道因为代码没有被注释。在该范围内未转义的每个字符都是有效的JSON。 Of course, 0x2028 and 0x2029 are not valid in Javascript(所以这个小细节使JSON语法不是Javascript语法的一个子集),所以如果它被用作真正的Javascript JSONP,最好逃避JSON中的那些。但是我不清楚为什么代码会逃避整个范围,因为范围内只有2个字符是非法的。