现在有在lua里直接解析json的纯lua库,使得解析json很方便,尤其是在lua接入网络协议,读取本地配置尤为重要,但目前使用下来,存在一些问题。
使用的json库为网上的流行的开源json库,并且是cocos原生附带的json库,如下:
-----------------------------------------------------------------------------
-- JSON4Lua: JSON encoding / decoding support for the Lua language.
-- json Module.
-- Author: Craig Mason-Jones
-- Homepage: http://json.luaforge.net/
-- Version: 0.9.40
-- This module is released under the MIT License (MIT).
-- Please see LICENCE.txt for details.
首先,lua本身不能识别\u83b7\u53d6\u6210\u529f这类unicode串,其次,lua也不支持解析”\/”这类转译,需要手动处理。
1.处理unicode的中文编码
--解析unicode编码的中文
local bit = require("bit")
local function unicode_to_utf8(convertStr)
if base.type(convertStr)~="string" then
return convertStr
end
local resultStr = ""
local i = 1
while true do
local unicode
local num1 = string.byte(convertStr,i)
if num1 ~= nil and string.sub(convertStr,i,i+1) == "\\u" then
unicode = base.tonumber("0x"..string.sub(convertStr,i+2,i+5))
i= i+6
elseif num1~=nil then
unicode = num1
i= i+1
else
break
end
--base.print(unicode)
if unicode <= 0x007f then
resultStr = resultStr..string.char(bit.band(unicode,0x7f))
elseif unicode >= 0x0080 and unicode <= 0x07ff then
resultStr = resultStr..string.char(bit.bor(0xc0,bit.band(bit.rshift(unicode,6),0x1f)))
resultStr = resultStr..string.char(bit.bor(0x80,bit.band(unicode,0x3f)))
elseif unicode >= 0x0800 and unicode <= 0xffff then
resultStr = resultStr..string.char(bit.bor(0xe0,bit.band(bit.rshift(unicode,12),0x0f)))
resultStr = resultStr..string.char(bit.bor(0x80,bit.band(bit.rshift(unicode,6),0x3f)))
resultStr = resultStr..string.char(bit.bor(0x80,bit.band(unicode,0x3f)))
end
end
--base.print(resultStr)
return resultStr
end
local function utf8_to_unicode(convertStr)
if base.type(convertStr)~="string" then
return convertStr
end
local resultStr = ""
local i = 1
local num1 = string.byte(convertStr,i)
while num1 ~= nil do
--base.print(num1)
local tempVar1,tempVar2
if num1 >= 0x00 and num1 <= 0x7f then
tempVar1 = num1
tempVar2 = 0
elseif bit.band(num1,0xe0)== 0xc0 then
local t1 = 0
local t2 = 0
t1 = bit.band(num1,bit.rshift(0xff,3))
i = i+1
num1 = string.byte(convertStr,i)
t2 = bit.band(num1,bit.rshift(0xff,2))
tempVar1 = bit.bor(t2,bit.lshift(bit.band(t1,bit.rshift(0xff,6)),6))
tempVar2 = bit.rshift(t1,2)
elseif bit.band(num1,0xf0)== 0xe0 then
local t1 = 0
local t2 = 0
local t3 = 0
t1 = bit.band(num1,bit.rshift(0xff,3))
i = i+1
num1=string.byte(convertStr,i)
t2 = bit.band(num1,bit.rshift(0xff,2))
i = i+1
num1 = string.byte(convertStr,i)
t3 = bit.band(num1,bit.rshift(0xff,2))
tempVar1=bit.bor(bit.lshift(bit.band(t2,bit.rshift(0xff,6)),6),t3)
tempVar2=bit.bor(bit.lshift(t1,4),bit.rshift(t2,2))
end
resultStr = resultStr..string.format("\\u%02x%02x",tempVar2,tempVar1)
--base.print(resultStr)
i = i+1
num1 = string.byte(convertStr,i)
end
--base.print(resultStr)
return resultStr
end
2.处理不能转译的\/字符
找到相应的串替换掉