UTF 8字串在lua中的字長問題

2021-08-03 22:51:09 字數 2057 閱讀 3092

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位...