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文本数据。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值