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

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

 判断utf8字符的字节长度

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

-- 判断utf8字符byte长度
function stringTool.chsize( char )
	    if not char then
        --print("not char")
        return 0
    elseif char > 240 then
        return 4
    elseif char > 225 then
        return 3
    elseif char > 192 then
        return 2
    else
        return 1
    end
end

按字符截取字符串

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

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

--截取字符串,按字符截取
-- str:         要截取的字符串
-- startChar:   开始字符下标,从1开始
-- numChars:    要截取的字符长度
function stringTool.utf8sub( str, startChar, numChars )
	local startIndex = 1
    while startChar > 1 do
        local char = string.byte(str, startIndex)
        startIndex = startIndex + stringTool.chsize(char)
        startChar = startChar - 1
    end

    local currentIndex = startIndex

    while numChars > 0 and currentIndex <= #str do
        local char = string.byte(str, currentIndex)
        currentIndex = currentIndex + stringTool.chsize(char)
        numChars = numChars -1
    end
    return str:sub(startIndex, currentIndex - 1), numChars
end

-- 计算utf8字符串字符数, 各种字符都按一个字符计算
function stringTool.utf8len( str )
    local len = 0
    local currentIndex = 1
    while currentIndex <= #str do
        local char = string.byte(str, currentIndex)
        currentIndex = currentIndex + stringTool.chsize(char)
        len = len +1
    end
    return len
end

-- 计算utf8字符串字符数, 中文按两个字符计算
function stringTool.utf8len_ChineseInTwo( str )
    local len = 0
    local currentIndex = 1
    while currentIndex <= #str do
        local char = string.byte(str, currentIndex)
        local charLength = stringTool.chsize(char)
        currentIndex = currentIndex + charLength
        if charLength > 2 then
            len = len + 2
        else
            len = len +1
        end        
    end
    return len
end

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值