Lua string.sub截取UTF8 中英混合字符

在使用Lua的过程中,经常会遇到需要截取字符串或者获得字符串真实长度的情况,而Lua自带的string.sub()对于中文字符会当作3个字符来处理,截取时会造成乱码。所以需要自己改造下,下面的SubStringUTF8()方法是我改编的SubString方法,经测试可以识别中英混合的字符串,不管是英文字符还是中文字符都当作一个字符来计算index,并且可以像系统的string.sub()一样使用负数来从末尾截取字符。其他的几个方法是SubStringUTF8()的依赖方法,也可以单独拿来使用。

--截取中英混合的UTF8字符串,endIndex可缺省
function SubStringUTF8(str, startIndex, endIndex)
    if startIndex < 0 then
        startIndex = SubStringGetTotalIndex(str) + startIndex + 1;
    end

    if endIndex ~= nil and endIndex < 0 then
        endIndex = SubStringGetTotalIndex(str) + endIndex + 1;
    end

    if endIndex == nil then 
        return string.sub(str, SubStringGetTrueIndex(str, startIndex));
    else
        return string.sub(str, SubStringGetTrueIndex(str, startIndex), SubStringGetTrueIndex(str, endIndex + 1) - 1);
    end
end

--获取中英混合UTF8字符串的真实字符数量
function SubStringGetTotalIndex(str)
    local curIndex = 0;
    local i = 1;
    local lastCount = 1;
    repeat 
        lastCount = SubStringGetByteCount(str, i)
        i = i + lastCount;
        curIndex = curIndex + 1;
    until(lastCount == 0);
    return curIndex - 1;
end

function SubStringGetTrueIndex(str, index)
    local curIndex = 0;
    local i = 1;
    local lastCount = 1;
    repeat 
        lastCount = SubStringGetByteCount(str, i)
        i = i + lastCount;
        curIndex = curIndex + 1;
    until(curIndex >= index);
    return i - lastCount;
end

--返回当前字符实际占用的字符数
function SubStringGetByteCount(str, index)
    local curByte = string.byte(str, index)
    local byteCount = 1;
    if curByte == nil then
        byteCount = 0
    elseif curByte > 0 and curByte <= 127 then
        byteCount = 1
    elseif curByte>=192 and curByte<=223 then
        byteCount = 2
    elseif curByte>=224 and curByte<=239 then
        byteCount = 3
    elseif curByte>=240 and curByte<=247 then
        byteCount = 4
    end
    return byteCount;
end
  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Lua中,string.sub函数用于截取字符串的一部分。它接受三个参数,分别是字符串s、起始位置i和结束位置j。函数会返回从第i个字符到第j个字符之间的子串。在Lua中,字符串的索引从1开始计数,而可以使用负索引从字符串的结尾向前计数。例如,string.sub(s, 1, j)将返回字符串s的长度为j的前缀,而string.sub(s, j, -1)将返回从第j个字符开始的后缀。如果只提供了前两个参数,则默认结束位置为字符串的末尾,可以简写为string.sub(s, j)。另外,使用string.sub(s, 2, -2)可以获取去除第一个和最后一个字符后的子串。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Lua中的string库(字符串函数库)总结](https://blog.csdn.net/php_Zhaop/article/details/72834384)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [lua socket客户端 lua string.pack字符串打包](https://blog.csdn.net/beyond706/article/details/105949783)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值