_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)