• 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

  • 相关阅读:
    SwiftUI 如何动态开始和停止播放永久重复(repeatForever)动画
    【Rust日报】2023-10-16 为什么要异步 Rust
    CV5200自组网远程WiFi模组,无人机无线图传应用,高清低时延方案
    原生js 多用途三元表达式 点赞按钮
    机器学习-无监督学习之聚类
    【愚公系列】华为云系列之DevCloud+ECS+MySQL搭建超级冷笑话网站【开发者专属集市】
    (七)fastai 2018 lesson8 目标检测
    LeetCode 刷题系列 -- 47. 全排列 II
    无胁科技-TVD每日漏洞情报-2022-9-8
    SQL限制用户只能看到指定的库或表(Navicat操作)
  • 原文地址:https://blog.csdn.net/u012685888/article/details/126961659