Lua獲取utf8字符串長度和字符串截取并用...代替

字號:


    這篇文章主要介紹了Lua獲取utf8字符串長度和字符串截取并用...代替,本文直接給出兩個函數(shù)的實現(xiàn)代碼,需要的朋友可以參考下
    一、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
    二、截取給定字符串的部分長度,超出部分用省略號“.”替換
    代碼如下:
    切割字符串,并用“...”替換尾部
    sName:要切割的字符串
    nMaxCount,字符串上限,中文字為2的倍數(shù)
    nShowCount:顯示英文字個數(shù),中文字為2的倍數(shù),可為空
    函數(shù)實現(xiàn):截取字符串一部分,剩余用“...”替換
    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