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文本數據。

 

發佈了67 篇原創文章 · 獲贊 10 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章