编辑代码

_utf8Headers = { 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc }

function utf8len(input, chnCount)
    if chnCount == nil then
        chnCount = 1
    end
    local len  = string.len(input)
    local left = len
    local cnt  = 0
    local arr  = _utf8Headers
    while left ~= 0 do
        local tmp   = string.byte(input, -left)
        local i     = #arr
        local count = 1
        while arr[i] do
            if tmp >= arr[i] then
                left = left - i
                if i ~= 1 then
                    count = chnCount
                end
                break
            end
            i = i - 1
        end
        cnt = cnt + count
    end
    return cnt
end

function utf8Substring(input, startIndex, endIndex)
    local startByte = 0
    local endByte   = 0
    local len       = string.len(input)
    local left      = len
    local curIndex  = 1
    local curByte   = 1
    local arr       = _utf8Headers
    while left > 0 do
        if startIndex == curIndex then
            startByte = curByte
        end
        if startByte ~= 0 and endByte ~= 0 then
            break
        end
        local tmp = string.byte(input, -left)
        local i = #arr
        while arr[i] do
            if tmp >= arr[i] then
                left = left - i
                curByte = curByte + i
                break
            end
            i = i - 1
        end
        if endIndex == curIndex then
            endByte = curByte - 1
        end
        if startByte ~= 0 and endByte ~= 0 then
            break
        end
        curIndex = curIndex + 1
    end
    if startByte == 0 or endByte == 0 then
        return nil
    else
        return string.sub(input, startByte, endByte)
    end
end

local test = "一二三四五六七八一二三四五六七八liugaoaang"

local result = utf8len(test)
local result2 = string.format(utf8Substring(test,1,8),"....")
local result3 = "yiersansi".."qibajiushi"
print(result)
print(result2)
print(result3)