日期:2014-05-16  浏览次数:20397 次

Haxe标准库中Json API的中文解析bug

目前的工作中需要在Haxe中解析Json文本,在haxelib中有两个Json相关的第三方库,不过都很久没更新了,从Haxe 2.1以后,Json API已经成为标准库中的一部分,具体即haxe.Json类。

目前我只用到解析,用起来也很简单,调用Json.parse(jsonText: String)即可把Json文本解析成Dynamic对象。支持布尔、整数、浮点数、字符串、数组、复合对象等数据类型。

要注意的一点是,属性名也必须用双引号引起来,否则无法解析,如下示例,uid和name外面的双引号是不能省略的:

{ "uid": 12345, "name": "Rocks Wang" }

在Flash目标中,运行时的字符串编码是Unicode,因此中文毫无问题,这里不赘述。

在cpp目标中,字符串在运行时其实就是C++中的char*,因此中文编码是需要引起特别注意的。Haxe及NME中对中文的处理还算不错,绝大部分情况下,只要保证使用UTF-8编码,中文即可正常解析及显示。

Json API也是一样,只要Json.parse(jsonText: String) 中jsonText参数是以UTF-8编码的,即可解析包含中文的Json文本。

但是实际使用中发现中文解析经常出错,经源码分析,确定是Json类中存在一个Bug,具体修正如下:

321行,修正前:

    else if( c >= 0x80 ) {
        pos++;  //这里多跳了一个字符,因为nextChar本身就要跳一个字符
        if( c >= 0xE0 ) pos += 1 + (c & 32); //根据第5位决定是否多跳一个字符,具体请参见UTF-8编码规范
修正后:

    else if( c >= 0x80 ) {
        pos += 1 + ((c & 32) >> 5);

做此修正后,Json类可完美解析含中文的Json文本数据。