Lua字符串(包含任意字符,如中文)任意位置截取
常规的截取只需要lua自带的api就可以解决问题:如 string.sub
但是当字符串之中含有中文或者符号的时候,这些接口就麻爪了,当然lua后续更新有可能支持,至少本少当前的Lua版本是不支持的。
废话少说,直接上代码和测试用例
-- 判断utf8字符byte长度
function stringTool.chsize( char )if not char then--print("not char")return 0elseif char > 240 thenreturn 4elseif char > 225 thenreturn 3elseif char > 192 thenreturn 2elsereturn 1end
end--截取字符串,按字符截取
-- str: 要截取的字符串
-- startChar: 开始字符下标,从1开始
-- numChars: 要截取的字符长度
function stringTool.GetStrSubStr( str, startChar, numChars )local startIndex = 1//1.获得从1到自定义的开始字符startChar之前有多少字符while startChar > 1 dolocal char = string.byte(str, startIndex)startIndex = startIndex + stringTool.chsize(char)startChar = startChar - 1endlocal currentIndex = startIndex//2.从自定义的开始到需要的长度下标有多少字符while numChars > 0 and currentIndex <= #str dolocal char = string.byte(str, currentIndex)currentIndex = currentIndex + stringTool.chsize(char)numChars = numChars -1end//3.根据两者下标对应的总字符长度获得需要截取的字符return str:sub(startIndex, currentIndex - 1), numChars
end
使用案例
local str1 = “测试打捞”
local str2 = “lq测试23ces”
local str3 = “65测试23ces”
log("测试11 = "…stringTool.GetStrSubStr(str1, 1, 1))
log("测试12 = "…stringTool.GetStrSubStr(str1, 2, 3))
log("测试21 = "…stringTool.GetStrSubStr(str2, 1, 3))
log("测试22 = "…stringTool.GetStrSubStr(str2, 1, 5))
log("测试31 = "…stringTool.GetStrSubStr(str3, 1, 4))
log("测试32 = "…stringTool.GetStrSubStr(str3, 2, 5))
打印:
测试11 = 测
测试12 = 试打
测试21 = lq测
测试22 = lq测试2
测试31 = 65测试
测试32 = 5测试2
参考原文链接:https://blog.csdn.net/u012685888/article/details/126961659