热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Lua中获取字符串长度整理

在Lua中,获取字符串长度我们一般使用#str(不建议使用string.len(str))!localstrabcl

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中计算含中文的字符串的长度



推荐阅读
author-avatar
随遇而安gqS1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有