在lua中使用json库容易遇到的问题

现在有在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.处理不能转译的\/字符

找到相应的串替换掉
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值