string.sub(s, i, j)
string.sub截取字符串,是按字节截取的。截取英文没问题,有中文就会出错,因为一个中文可能是2到5个字节。所以我们需要先获取字符的字节长度。
string.byte(s, i, j)
- 参数s为字符串,i为开始字符索引,j为结束字符索引
- 解释:函数返回字符
s[i], s[i+1], ···, s[j]
的内部数字编码(ASCII码),其中参数i
的默认值是1,而参数j
的默认值是i
。需要注意的是该函数在返回的数字编码在跨平台方面不一定是可移植的。
通过这个函数和chsize,我们可以获取到字符串里任意字符的字节数。
如下面的代码,可以获取字符串str1 的第一个字符 ‘字’ 的长度len
local str1 = "字符"
local char = string.byte(str1, 1)
local len = stringTool.chsize(char)
判断utf8字符的字节长度
根据内部数字编码(ASCII码)获取字符的字节长度
-- 判断utf8字符byte长度
function stringTool.chsize( char )
if not char then
--print("not char")
return 0
elseif char > 240 then
return 4
elseif char > 225 then
return 3
elseif char > 192 then
return 2
else
return 1
end
end
按字符截取字符串
可以截取含中文的字符串,按字符截取。
先把字符的位置转换为字节的位置,再用sub函数截取。
--截取字符串,按字符截取
-- str: 要截取的字符串
-- startChar: 开始字符下标,从1开始
-- numChars: 要截取的字符长度
function stringTool.utf8sub( str, startChar, numChars )
local startIndex = 1
while startChar > 1 do
local char = string.byte(str, startIndex)
startIndex = startIndex + stringTool.chsize(char)
startChar = startChar - 1
end
local currentIndex = startIndex
while numChars > 0 and currentIndex <= #str do
local char = string.byte(str, currentIndex)
currentIndex = currentIndex + stringTool.chsize(char)
numChars = numChars -1
end
return str:sub(startIndex, currentIndex - 1), numChars
end
-- 计算utf8字符串字符数, 各种字符都按一个字符计算
function stringTool.utf8len( str )
local len = 0
local currentIndex = 1
while currentIndex <= #str do
local char = string.byte(str, currentIndex)
currentIndex = currentIndex + stringTool.chsize(char)
len = len +1
end
return len
end
-- 计算utf8字符串字符数, 中文按两个字符计算
function stringTool.utf8len_ChineseInTwo( str )
local len = 0
local currentIndex = 1
while currentIndex <= #str do
local char = string.byte(str, currentIndex)
local charLength = stringTool.chsize(char)
currentIndex = currentIndex + charLength
if charLength > 2 then
len = len + 2
else
len = len +1
end
end
return len
end