近日某同事在用java发布一个API时,使用Json进行数据编码,发现JSON官方的java扩展在处理汉字时未进行ascii转义,如下所示:
Java源码:

AppObject ao=new AppObject(20,"鱼漂");
try {
JSONObject jo=new JSONObject(ao);
System.out.println(jo.toString());
} catch (Exception e) {
System.out.println("json encode error.");
}

输出为:
{"name":"鱼漂","age":10}

其中的name仍然显示中文,未进行ascii转义,通常情况下是可以正常使用的,但在不同的系统互相调用时,可能需要编码转换,比如从GBK转到UTF8。

通过查看源代码发现,在JSONObject.java的1138-1139行,只将\u0080-\u00a0, \u2000-\u2100的字符转成\u的格式。汉字的unicode编码不在这两个范围之内,所以不会转换。

找到原因后,修改就比较简单,我们只需简单的将\u0080以上的所有字符,转成\u格式即可,将1138-1139行改为:
if (c < ' ' || c >= '\u0080') {

再次测试,输出结果为:
{"name":"\u9c7c\u6f02","age":10}

注:
1. JSON官方的java扩展可以在 http://www.json.org/java/ 找到
2. PHP自带的json扩展没此问题
3. 本文原载于 http://www.eit.name/
4. 关于汉字在unicode的位段,可参考前一篇转载的博文.

  因为FontRouter新版本开发的需要,在网上搜索了一下汉字的Unicode范围,普遍给出了“U+4E00..U+9FA5”。但事实上这个范围是不完整的,甚至连基本的全角(中文)标点也未包含在内。为此,我特地查询了Unicode官方的Code Charts数据库,并根据最新的Unicode 5.0版整理如下:

注:在绝大多数应用场合中,我们可以仅用(1)、(2)、(3)、(4)、(5)的集合作为CJK判断的依据。

1)标准CJK文字

http://www.unicode.org/Public/UNIDATA/Unihan.html

Code point rangeBlock nameRelease
U+3400..U+4DB5CJK Unified Ideographs Extension A3.0
U+4E00..U+9FA5CJK Unified Ideographs1.1
U+9FA6..U+9FBBCJK Unified Ideographs4.1
U+F900..U+FA2DCJK Compatibility Ideographs1.1
U+FA30..U+FA6ACJK Compatibility Ideographs3.2
U+FA70..U+FAD9CJK Compatibility Ideographs4.1
U+20000..U+2A6D6CJK Unified Ideographs Extension B3.1
U+2F800..U+2FA1DCJK Compatibility Supplement3.1

2)全角ASCII、全角中英文标点、半宽片假名、半宽平假名、半宽韩文字母:FF00-FFEF

http://www.unicode.org/charts/PDF/UFF00.pdf

3)CJK部首补充:2E80-2EFF

http://www.unicode.org/charts/PDF/U2E80.pdf

4)CJK标点符号:3000-303F

http://www.unicode.org/charts/PDF/U3000.pdf

5)CJK笔划:31C0-31EF

http://www.unicode.org/charts/PDF/U31C0.pdf

6)康熙部首:2F00-2FDF

http://www.unicode.org/charts/PDF/U2F00.pdf

7)汉字结构描述字符:2FF0-2FFF

http://www.unicode.org/charts/PDF/U2FF0.pdf

8)注音符号:3100-312F

http://www.unicode.org/charts/PDF/U3100.pdf

9)注音符号(闽南语、客家语扩展):31A0-31BF

http://www.unicode.org/charts/PDF/U31A0.pdf

10)日文平假名:3040-309F

http://www.unicode.org/charts/PDF/U3040.pdf

11)日文片假名:30A0-30FF

http://www.unicode.org/charts/PDF/U30A0.pdf

12)日文片假名拼音扩展:31F0-31FF

http://www.unicode.org/charts/PDF/U31F0.pdf

13)韩文拼音:AC00-D7AF

http://www.unicode.org/charts/PDF/UAC00.pdf

14)韩文字母:1100-11FF

http://www.unicode.org/charts/PDF/U1100.pdf

15)韩文兼容字母:3130-318F

http://www.unicode.org/charts/PDF/U3130.pdf

16)太玄经符号:1D300-1D35F

http://www.unicode.org/charts/PDF/U1D300.pdf

17)易经六十四卦象:4DC0-4DFF

http://www.unicode.org/charts/PDF/U4DC0.pdf

18)彝文音节:A000-A48F

http://www.unicode.org/charts/PDF/UA000.pdf

19)彝文部首:A490-A4CF

http://www.unicode.org/charts/PDF/UA490.pdf

20)盲文符号:2800-28FF

http://www.unicode.org/charts/PDF/U2800.pdf

21)CJK字母及月份:3200-32FF

http://www.unicode.org/charts/PDF/U3200.pdf

22)CJK特殊符号(日期合并):3300-33FF

http://www.unicode.org/charts/PDF/U3300.pdf

23)装饰符号(非CJK专用):2700-27BF

http://www.unicode.org/charts/PDF/U2700.pdf

24)杂项符号(非CJK专用):2600-26FF

http://www.unicode.org/charts/PDF/U2600.pdf

25)中文竖排标点:FE10-FE1F

http://www.unicode.org/charts/PDF/UFE10.pdf

26)CJK兼容符号(竖排变体、下划线、顿号):FE30-FE4F

http://www.unicode.org/charts/PDF/UFE30.pdf

以上翻译自Unicode官方网站,部分译法可能不够准确,还望大家予以指正!如有疏漏、错误之处也请一并指出,多谢!

分页: 1/1 第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]