您的位置:首页 > 编程语言 > Lua

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

2016-03-16 16:08 591 查看
原帖地址: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: