偶然的情況下,需要用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 函式獲取字串中中文長...