utf-8字串在lua中每個字元的字長是不一樣,中文,英文,其他字元。都有各自不同的字長,所以utf-8也叫作變長字元。規則如下:
1. utf8字元是變長字元
2. 字元長度有規律
utf-8字元規律
字串的首個byte表示了該utf8字元的長度
0******x - 1 byte
110y***x - 192, 2 byte
1110yyyy - 225, 3 byte
11110zzz - 240, 4 byte
所以,要想滿足自己對字串按字元數量擷取的話,就要進行一下包裝了,直接貼**,如下:
local utf8 = {}
function utf8.chsize(char)
if not char then
return 0
elseif char > 240 then
return 4
elseif char > 225 then
return 3
elseif char > 192 then
return 2
else
return 1
endendfunction utf8.sub(str, startchar, numchars)
if str == nil then
return ""
endlocal startindex = 1
if (startchar==nil) then
startchar = 1;
endif (numchars==nil) then
numchars =15;
end;
local allchars = numchars
while startchar > 1 do
local char = string.byte(str, startindex)
startindex = startindex + utf8.chsize(char)
startchar = startchar - 1
endlocal currentindex = startindex
while currentindex <= numchars and currentindex <= #str do
local char = string.byte(str, currentindex)
currentindex = currentindex + utf8.chsize(char)
endif numchars < #str then
return str:sub(startindex, currentindex - 1).."..."
else
return str:sub(startindex, currentindex - 1)
endend
function utf8.length(str)
local length = 0;
local currentindex = 1;
while currentindex <= #str do
local char = string.byte(str, currentindex)
currentindex = currentindex + utf8.chsize(char)
length = length + 1
endreturn length;
endfunction utf8.tostring(str)
if type(str)=="string" then
return str
endlocal char = ""
if type(str)~="table" then
return char
endfor key, var in pairs(str) do
if var == "\0" then
break
endchar = char .. var
endreturn char
endreturn utf8;
Lua處理UTF8字串
專案裡遇到用string.sub擷取中文字串會擷取出來非空,但是無法展示的情況,進行utf字串處理後ok.核心部分是utf字串的判斷 utf 8 字元處理 local function stringtotable s local tb utf8的編碼規則 1.字元的第乙個位元組範圍 0x00 0x7...
PHP正確解析UTF 8字串
在 學習php mysql之 字元編碼篇 一 中介紹了unicode與utf 8的轉換關係,總結了乙個utf 8的編碼規則,根據這個編碼規則,寫乙個utf 8編碼的解析程式,以下是php的實現 view code 程式功能,str是中英文混合的utf 8編碼字串,將此字串根據utf 8的編碼規則正確...
UTF 8字元處理
參考 utf 8格式位元組 4中情況分別是 1 乙個位元組 0 x,低7位為有效資料,內碼是0x0 0x7f 2 兩個位元組 110 xx 10yyyyyy,低5位 低6位為有效資料,內碼是0x80 0x7ff 3 三個位元組 1110 x 10yyyyyy 10zzzzzz,低4位 低6位 低6位...