纯lua实现 utf-16le 和 utf-8互转

22 篇文章 0 订阅
19 篇文章 0 订阅
原帖地址:http://www.cocoachina.com/bbs/read.php?tid-312194.html

做了一些小小的修改:

do
    local bit = require("bit")
    local resultStr={}
    local function utf16le_to_utf8(convertStr)
        if type(convertStr)~="string" then
            return convertStr
        end
        
        local i=1
        local len = 1;
        while true do
            local num1=string.byte(convertStr,i)
            local unicode;
            if num1 ~= nil then
                local num2=string.byte(convertStr,i+1)
                unicode = bit.bor(num1, bit.lshift(num2, 8));
                i=i+2;
            else
                break;
            end

            -- print(unicode)
      
            if unicode <= 0x007f then

                resultStr[len] = string.char(bit.band(unicode,0x7f))
                len = len + 1;
            elseif unicode >= 0x0080 and unicode <= 0x07ff then
                
                resultStr[len] = string.char(bit.bor(0xc0,bit.band(bit.rshift(unicode,6),0x1f)))
                len = len + 1;
                resultStr[len] = string.char(bit.bor(0x80,bit.band(unicode,0x3f)))
                len = len + 1;
            elseif unicode >= 0x0800 and unicode <= 0xffff then

                resultStr[len] = string.char(bit.bor(0xe0,bit.band(bit.rshift(unicode,12),0x0f)))
                len = len + 1;
                resultStr[len] = string.char(bit.bor(0x80,bit.band(bit.rshift(unicode,6),0x3f)))
                len = len + 1;
                resultStr[len] = string.char(bit.bor(0x80,bit.band(unicode,0x3f)))
                len = len + 1;
            end
        
        end
        
        -- resultStr[len] = '\0'
        -- print(resultStr)
        
        return table.concat(resultStr, "", 1, len-1)
        
    end
    local function utf8_to_utf16le(convertStr)

        if type(convertStr)~="string" then
            return convertStr
        end
        
        local i=1
        local len = 1;
        local num1=string.byte(convertStr,i)
        
        while num1~=nil do
        
            -- 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[len] = string.char(tempVar1) .. string.char(tempVar2);
            len = len + 1;
            -- print(resultStr[len - 1])
            
            i=i+1
            num1=string.byte(convertStr,i)
        end
        
        return table.concat(resultStr, "", 1, len - 1)

    end
end


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值