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

一、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

相关推荐