当前位置 博文首页 > Lua获取utf8字符串长度和字符串截取并用...代替

    Lua获取utf8字符串长度和字符串截取并用...代替

    作者:admin 时间:2021-02-12 18:32

    一、LUA获取utf8字符串长度

    复制代码 代码如下:

    --- 获取utf8编码字符串正确长度的方法
    -- @param str
    -- @return number
    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

    二、截取给定字符串的部分长度,超出部分用省略号“.”替换

    复制代码 代码如下:

    --@brief 切割字符串,并用“...”替换尾部
    --@param sName:要切割的字符串
    --@return nMaxCount,字符串上限,中文字为2的倍数
    --@param nShowCount:显示英文字个数,中文字为2的倍数,可为空
    --@note         函数实现:截取字符串一部分,剩余用“...”替换

    function GetShortName(sName,nMaxCount,nShowCount)
        if sName == nil or nMaxCount == nil then
            return
        end
        local sStr = sName
        local tCode = {}
        local tName = {}
        local nLenInByte = #sStr
        local nWidth = 0
        if nShowCount == nil then
           nShowCount = nMaxCount - 3
        end
        for i=1,nLenInByte do
            local curByte = string.byte(sStr, i)
            local byteCount = 0;
            if 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
            local char = nil
            if byteCount > 0 then
                char = string.sub(sStr, i, i+byteCount-1)
                i = i + byteCount -1
            end
            if byteCount == 1 then
                nWidth = nWidth + 1
                table.insert(tName,char)
                table.insert(tCode,1)
               
            elseif byteCount > 1 then
                nWidth = nWidth + 2
                table.insert(tName,char)
                table.insert(tCode,2)
            end
        end
       
        if nWidth > nMaxCount then
            local _sN = ""
            local _len = 0
            for i=1,#tName do
                _sN = _sN .. tName[i]
                _len = _len + tCode[i]
                if _len >= nShowCount then
                    break
                end
            end
            sName = _sN .. "..."
        end
        return sName
    end

    js
    下一篇:没有了