string.sub截取字符串,是按字节截取的。截取英文没问题,有中文就会出错,因为一个中文可能是2到5个字节。所以我们需要先获取字符的字节长度。
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)
根据内部数字编码(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