Lua中獲取字串長度

2021-10-11 05:11:20 字數 2387 閱讀 9242

偶然的情況下,需要用lua**獲取字串的長度,結果發現結果和自己想象的不一樣,乙個漢字算兩個英文本元的時代已經快過去了,乙個中文字元列印出來的長度為3,引起了我的好奇,查詢資料了解了具體原因

不同的編碼格式佔位元組數是不同的,utf-8編碼下乙個中文所佔位元組也是不確定的,通常是3個字元,可能是2個、4個位元組;

出於效率考慮,於是又弄了乙個utf-16,不嚴謹地來說它等價於unicode原生編碼,它統一採用雙位元組表示乙個字元

下面是unicode和utf-8轉換的規則 

1 unicode 

2

3 utf-8

4

5 0000 - 007f

6

7 0******x

8

9 0080 - 07ff

10

11 110***xx 10******

12

13 0800 - ffff

14

15 1110***x 10****** 10******

例如"漢"字的unicode編碼是6c49

6c49在0800-ffff之間,所以要用3位元組模板:1110***x 10****** 10******。將6c49寫成二進位制是:0110 1100 0100 1001,將這個位元流按三位元組模板的分段方法分為0110 110001 001001,依次代替模板中的x,得到:

1110-0110 10-110001 10-001001,即e6 b1 89,這就是其utf8的編碼

gbk、gb2312收編的漢字佔2個位元組,嚴格地用iso8859-1無法表示漢字,只能轉為問號

下面是lua獲取字串長度的方法:

方案一:

-- 獲取字串的長度(任何單個字元長度都為1)

function getstringlength(inputstr)

if not inputstr or type(inputstr) ~= "string" or #inputstr <= 0 then

return nil

endlocal length = 0 -- 字元的個數

local i = 1

while true do

local curbyte = string.byte(inputstr, i)

local bytecount = 1

if curbyte > 239 then

bytecount = 4 -- 4位元組字元

elseif curbyte > 223 then

bytecount = 3 -- 漢字

elseif curbyte > 128 then

bytecount = 2 -- 雙位元組字元

else

bytecount = 1 -- 單位元組字元

end-- local char = string.sub(inputstr, i, i + bytecount - 1)

-- print(char) -- 列印單個字元

i = i + bytecount

length = length + 1

if i > #inputstr then

break

endend

return length

end

local str = "i think,故我在!"

local len = getstringlength(str)

print(len) -- 12

方案二:

-- 計算 utf8 字串的長度,每乙個中文算乙個字元

function utf8len(input)

local len = string.len(input)

local left = len

local cnt = 0

local arr =

while left ~= 0 do

local tmp = string.byte(input, left)

local i = #arr

while arr[i] do

if tmp >= arr[i] then

left = left - i

break

endi = i - 1

endcnt = cnt + 1

endreturn cnt

end

local str = "i think,故我在!"

local len = utf8len(str)

print(len) -- 12

乙個漢字佔幾個位元組,詳解與原理:

lua中獲取字串長度:

Oracle獲取字串長度

oracle中常用的字串長度獲取方法,有兩個 lengthb string 和length string b是byte位元組的意思 其中 lengthb string 計算string所佔的位元組長度 返回字串的長度,單位是位元組 length string 計算string所佔的字元長度 返回字串...

shell獲取字串長度

方法1 使用wc l命令 wc l可以獲取到當前行的長度,因此對於單獨行的字串可以用這個簡單的方法獲取,另外wc l則是獲取當前字串內容的行數。如下 echo abc wc l 方法2 expr length string 使用expr length可以獲取string的長度 方法3 awk獲取域的...

獲取字串的長度

php中有乙個神奇的函式,可以直接獲取字串的長度,這個函式就是strlen 例子如下 str hello len strlen str echo len 輸出結果是5strlen函式對於計算英文字元是非常的擅長,但是如果有中文漢字,要計算長度該怎麼辦?可以使用mb strlen 函式獲取字串中中文長...