作者:随遇而安gqS1 | 来源:互联网 | 2023-09-12 11:13
在 Lua 中,获取字符串长度我们一般使用 #str(不建议使用 string.len(str) )!
local str = "abc"
local len = #str
print(len) -- 3
str = "你们好"
len = #str
print(len) -- 9
这里就出现了一个问题:为啥字符串 abc 的长度为 3,而字符串 你们好 的长度却是 9 呢?难道是哪里出问题了?当然不是!
其实这是字符编码导致的,在使用 UTF-8 字符编码的情况下,一个中文字符一般占 3 个字节,所以 3 个中文字符自然就是 9 个字节咯!
那么问题来了,现在我需要不管是中文字符还是其他字符,长度都为 1 该咋整呢?
这里记录两种方案:
方案一
-- 获取字符串的长度(任何单个字符长度都为1)
function getStringLength(inputstr)
if not inputstr or type(inputstr) ~&#61; "string" or #inputstr <&#61; 0 then
return nil
end
local length &#61; 0 -- 字符的个数
local i &#61; 1
while true do
local curByte &#61; string.byte(inputstr, i)
local byteCount &#61; 1
if curByte > 239 then
byteCount &#61; 4 -- 4字节字符
elseif curByte > 223 then
byteCount &#61; 3 -- 汉字
elseif curByte > 128 then
byteCount &#61; 2 -- 双字节字符
else
byteCount &#61; 1 -- 单字节字符
end
-- local char &#61; string.sub(inputstr, i, i &#43; byteCount - 1)
-- print(char) -- 打印单个字符
i &#61; i &#43; byteCount
length &#61; length &#43; 1
if i > #inputstr then
break
end
end
return length
end
local str &#61; "I think,故我在&#xff01;"
local len &#61; getStringLength(str)
print(len) -- 12
方案二
-- 计算 UTF8 字符串的长度&#xff0c;每一个中文算一个字符
function utf8len(input)
local len &#61; string.len(input)
local left &#61; len
local cnt &#61; 0
local arr &#61; {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}
while left ~&#61; 0 do
local tmp &#61; string.byte(input, -left)
local i &#61; #arr
while arr[i] do
if tmp >&#61; arr[i] then
left &#61; left - i
break
end
i &#61; i - 1
end
cnt &#61; cnt &#43; 1
end
return cnt
end
local str &#61; "I think,故我在&#xff01;"
local len &#61; utf8len(str)
print(len) -- 12
归根结底其实就是对 UTF-8 字符编码进行处理&#xff01;
参考&#xff1a;
关于字符编码的八个点
在Lua中计算含中文的字符串的长度