lua如何截取中英文混合字符串

lua在utf8下一个中文字长度为3,这样在中英文混排时截取字符串就比较麻烦,下面的函数是中文字长度为1下的处理


-- 获取utf8编码字符串长度,中文长度为1
function utfstrlen(str)
    local len = #str;
    local left = len;
    local cnt = 0;
    local arr={0,0xc0,0xe0,0xf0,0xf8,0xfc};
    while left ~= 0 do
        local tmp=string.byte(str,-left);
        local i=#arr;
        while arr[i] do
            if tmp>=arr[i] then left=left-i;break;end
            i=i-1;
        end
        cnt=cnt+1;
    end
    return cnt;
end


--截取中英文混合字符串
--参数
--  string str  原始字符串
--  number start 起始位置,注意中文长度为1
--  number len  截取长度
--返回值
--  string 截取后的字符串
--备注
--  1)中文UTF8默认占3个字节,可能对于一些占2个或4个字节的中文处理有问题
--  2)回车\n等特殊控制字符也算一个长度
function subUTF8String(str, start, len)
    local firstResult = ""
    local strResult = ""
    local maxLen = string.len(str)
    start = start - 1
    --找到起始位置
    local preSite = 1
    if start > 0 then
        for i = 1, maxLen do
            local s_dropping = string.byte(str, i)
            if not s_dropping then
                local s_str = string.sub(str, preSite, i - 1)
                preSite = i + 1
                break
            end


            if s_dropping < 128 or (i + 1 - preSite) == 3 then
                local s_str = string.sub(str, preSite, i)
                preSite = i + 1
                firstResult = firstResult..s_str
                local curLen = utfstrlen(firstResult)
                if (curLen == start) then
                    break
                end
            end
        end
    end
    
    
    --截取字符串
    preSite = string.len(firstResult) + 1
    local startC = preSite
    for i = startC, maxLen do
        local s_dropping = string.byte(str, i)
        if not s_dropping then
            local s_str = string.sub(str, preSite, i - 1)
            preSite = i
            strResult = strResult..s_str
            return strResult
        end


        if s_dropping < 128 or (i + 1 - preSite) == 3 then
            local s_str = string.sub(str, preSite, i)
            preSite = i + 1
            strResult = strResult..s_str
            local curLen = utfstrlen(strResult)
            if (curLen == len) then
                return strResult
            end
        end
    end
    
    return strResult
end




例如:
print(subUTF8String("我爱死你们", 2, 3))
    print(subUTF8String("abcde", 2, 3))
    print(subUTF8String("我11爱死你们", 2, 3))
    print(subUTF8String("我1", 2, 3))
    print(subUTF8String("我日1爱死你们", 2, 3))
的结果是
[LUA-print] 爱死你
[LUA-print] bcd
[LUA-print] 11爱
[LUA-print] 1
[LUA-print] 日1爱
### Lua 支持的字符编码格式 Lua本身并不强制规定特定的字符编码格式,但在实际应用中通常会涉及到多种常见的编码方式。对于单字节字符集而言,由于每个字符仅占用一个字节的空间,在处理这类数据时可以利用标准`string`库中的函数而不会遇到任何障碍[^2]。 然而当面对多字节字符集(如中文所使用的GB2312、GBK、UTF-8等),情况则变得复杂起来。这些编码方案下,某些特殊符号或非ASCII范围内的字符可能由两个甚至更多连续字节组成。因此直接采用默认方法可能会导致错误的结果。例如: - UTF-8 编码环境下,英文字符仍保持为单一字节表示形式,但对于大部分其他语言的文字,则分别采用了3至4个字节不等的形式进行存储[^3]。 为了更好地兼容国际化需求,Lua 提供了一个专门用于操作Unicode字符串的标准模块——`utf8`。该模块允许开发者执行诸如查找给定位置处的有效代码单元数量之类的任务,从而使得即使是在存在复合字符的情况下也能准确无误地完成各种必要的转换工作[^5]。 ```lua local str = "你好, world!" for i = 1,#str do local codepoint = utf8.codepoint(str,i) if(codepoint ~= nil)then print(utf8.offset(str,i)) end end ``` 上述脚本展示了如何遍历混合有不同编码类型的字符串,并安全地访问每一个独立字符的位置信息而不必担心潜在的边界越界风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值