您的位置:首页 > 编程语言 > Lua

Lua字符串中的中英文分割处理

2017-07-14 15:26 447 查看
-- 计算 UTF8 字符串的长度,每一个中文算一个字符
-- @function [parent=#string] utf8len
-- @param string input 输入字符串
-- @return integer#integer  长度
--[[--
计算 UTF8 字符串的长度,每一个中文算一个字符
~~~ lua
local input = "你好World"
print(string.utf8len(input))
-- 输出 7
~~~
]]
-- end --
function string.utf8len(input)
local len  = string.len(input)
local left = len
local cnt  = 0
local arr  = {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}
while left ~= 0 do
local tmp = string.byte(input, -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

-- lzh
-- 功能:将字符串拆成单个字符,存在一个table中
function string.utf8tochars(input)
local list = {}
local len  = string.len(input)
local index = 1
local arr  = {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}
while index <= len do
local c = string.byte(input, index)
local offset = 1
if c < 0xc0 then
offset = 1
elseif c < 0xe0 then
offset = 2
elseif c < 0xf0 then
offset = 3
elseif c < 0xf8 then
offset = 4
elseif c < 0xfc then
offset = 5
end
local str = string.sub(input, index, index+offset-1)
-- print(str)
index = index + offset
table.insert(list, {byteNum = offset, char = str})
end

return list
end

---------应用的例子---------
-- 函数功能:字符处理
--          超30个英文字符长度,后面的用...代替
function Test:ProcessEmailName(content)
local chars = string.utf8tochars(content)
local nums = 0
local newString = ""
for i,v in ipairs(chars or {}) do
if v.byteNum>=3 then
nums = nums + 2
else
nums = nums + 1
end
-- 限制超过30个英文字符的长度
-- printLog(nums)
if nums <= 30 then
newString = newString .. v.char
else
newString = newString .. "..."
break
end
end
return newString
end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: