• lua字符串相关方法,如截取中文字符串


    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

    1. local str1 = "字符"
    2. local char = string.byte(str1, 1)
    3. local len = stringTool.chsize(char)

     判断utf8字符的字节长度

    根据内部数字编码(ASCII码)获取字符的字节长度

    1. -- 判断utf8字符byte长度
    2. function stringTool.chsize( char )
    3. if not char then
    4. --print("not char")
    5. return 0
    6. elseif char > 240 then
    7. return 4
    8. elseif char > 225 then
    9. return 3
    10. elseif char > 192 then
    11. return 2
    12. else
    13. return 1
    14. end
    15. end

    按字符截取字符串

    可以截取含中文的字符串,按字符截取。

    先把字符的位置转换为字节的位置,再用sub函数截取。

    1. --截取字符串,按字符截取
    2. -- str: 要截取的字符串
    3. -- startChar: 开始字符下标,从1开始
    4. -- numChars: 要截取的字符长度
    5. function stringTool.utf8sub( str, startChar, numChars )
    6. local startIndex = 1
    7. while startChar > 1 do
    8. local char = string.byte(str, startIndex)
    9. startIndex = startIndex + stringTool.chsize(char)
    10. startChar = startChar - 1
    11. end
    12. local currentIndex = startIndex
    13. while numChars > 0 and currentIndex <= #str do
    14. local char = string.byte(str, currentIndex)
    15. currentIndex = currentIndex + stringTool.chsize(char)
    16. numChars = numChars -1
    17. end
    18. return str:sub(startIndex, currentIndex - 1), numChars
    19. end

    1. -- 计算utf8字符串字符数, 各种字符都按一个字符计算
    2. function stringTool.utf8len( str )
    3. local len = 0
    4. local currentIndex = 1
    5. while currentIndex <= #str do
    6. local char = string.byte(str, currentIndex)
    7. currentIndex = currentIndex + stringTool.chsize(char)
    8. len = len +1
    9. end
    10. return len
    11. end
    12. -- 计算utf8字符串字符数, 中文按两个字符计算
    13. function stringTool.utf8len_ChineseInTwo( str )
    14. local len = 0
    15. local currentIndex = 1
    16. while currentIndex <= #str do
    17. local char = string.byte(str, currentIndex)
    18. local charLength = stringTool.chsize(char)
    19. currentIndex = currentIndex + charLength
    20. if charLength > 2 then
    21. len = len + 2
    22. else
    23. len = len +1
    24. end
    25. end
    26. return len
    27. end

  • 相关阅读:
    win系统环境搭建(二)——Windows安装JDK8
    Vue源码解析-简单实现真实DOM转虚拟DOM,虚拟DOM转真实DOM(二)
    kangle一键安装脚本
    学习黑马程序员JavaScript总结
    2154. 将找到的值乘以 2
    微信小程序--云开发
    【C语言】循环语句详解
    多台机器下本地缓存一致性解决(附带源码链接)
    mysql常见命令
    8年研发工程师心路历程(道与术皆得)
  • 原文地址:https://blog.csdn.net/u012685888/article/details/126961659