lua如何截取中英文混合字符串
来源:互联网 发布:网络用语dm是什么意思 编辑:程序博客网 时间:2024/06/05 14:37
lua在utf8下一个中文字长度为3,这样在中英文混排时截取字符串就比较麻烦,下面的函数是中文字长度为1下的处理
-- 获取utf8编码字符串长度,中文长度为1
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
--截取中英文混合字符串
--参数
-- string str 原始字符串
-- number start 起始位置,注意中文长度为1
-- number len 截取长度
--返回值
-- string 截取后的字符串
--备注
-- 1)中文UTF8默认占3个字节,可能对于一些占2个或4个字节的中文处理有问题
-- 2)回车\n等特殊控制字符也算一个长度
function subUTF8String(str, start, len)
local firstResult = ""
local strResult = ""
local maxLen = string.len(str)
start = start - 1
--找到起始位置
local preSite = 1
if start > 0 then
for i = 1, maxLen do
local s_dropping = string.byte(str, i)
if not s_dropping then
local s_str = string.sub(str, preSite, i - 1)
preSite = i + 1
break
end
if s_dropping < 128 or (i + 1 - preSite) == 3 then
local s_str = string.sub(str, preSite, i)
preSite = i + 1
firstResult = firstResult..s_str
local curLen = utfstrlen(firstResult)
if (curLen == start) then
break
end
end
end
end
--截取字符串
preSite = string.len(firstResult) + 1
local startC = preSite
for i = startC, maxLen do
local s_dropping = string.byte(str, i)
if not s_dropping then
local s_str = string.sub(str, preSite, i - 1)
preSite = i
strResult = strResult..s_str
return strResult
end
if s_dropping < 128 or (i + 1 - preSite) == 3 then
local s_str = string.sub(str, preSite, i)
preSite = i + 1
strResult = strResult..s_str
local curLen = utfstrlen(strResult)
if (curLen == len) then
return strResult
end
end
end
return strResult
end
例如:
print(subUTF8String("我爱死你们", 2, 3))
print(subUTF8String("abcde", 2, 3))
print(subUTF8String("我11爱死你们", 2, 3))
print(subUTF8String("我1", 2, 3))
print(subUTF8String("我日1爱死你们", 2, 3))
的结果是
[LUA-print] 爱死你
[LUA-print] bcd
[LUA-print] 11爱
[LUA-print] 1
[LUA-print] 日1爱
-- 获取utf8编码字符串长度,中文长度为1
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
--截取中英文混合字符串
--参数
-- string str 原始字符串
-- number start 起始位置,注意中文长度为1
-- number len 截取长度
--返回值
-- string 截取后的字符串
--备注
-- 1)中文UTF8默认占3个字节,可能对于一些占2个或4个字节的中文处理有问题
-- 2)回车\n等特殊控制字符也算一个长度
function subUTF8String(str, start, len)
local firstResult = ""
local strResult = ""
local maxLen = string.len(str)
start = start - 1
--找到起始位置
local preSite = 1
if start > 0 then
for i = 1, maxLen do
local s_dropping = string.byte(str, i)
if not s_dropping then
local s_str = string.sub(str, preSite, i - 1)
preSite = i + 1
break
end
if s_dropping < 128 or (i + 1 - preSite) == 3 then
local s_str = string.sub(str, preSite, i)
preSite = i + 1
firstResult = firstResult..s_str
local curLen = utfstrlen(firstResult)
if (curLen == start) then
break
end
end
end
end
--截取字符串
preSite = string.len(firstResult) + 1
local startC = preSite
for i = startC, maxLen do
local s_dropping = string.byte(str, i)
if not s_dropping then
local s_str = string.sub(str, preSite, i - 1)
preSite = i
strResult = strResult..s_str
return strResult
end
if s_dropping < 128 or (i + 1 - preSite) == 3 then
local s_str = string.sub(str, preSite, i)
preSite = i + 1
strResult = strResult..s_str
local curLen = utfstrlen(strResult)
if (curLen == len) then
return strResult
end
end
end
return strResult
end
例如:
print(subUTF8String("我爱死你们", 2, 3))
print(subUTF8String("abcde", 2, 3))
print(subUTF8String("我11爱死你们", 2, 3))
print(subUTF8String("我1", 2, 3))
print(subUTF8String("我日1爱死你们", 2, 3))
的结果是
[LUA-print] 爱死你
[LUA-print] bcd
[LUA-print] 11爱
[LUA-print] 1
[LUA-print] 日1爱
0 0
- lua如何截取中英文混合字符串
- lua截取中英文混合字符串
- 如何正确截取中英文混合的字符串?
- 截取中英文混合字符串
- 截取中英文混合字符串
- 中英文混合字符串截取
- 中英文混合字符串截取
- lua 截取中英文字符串
- ASP如何计算中英文混合字符串长度和截取字符串
- ASP如何计算中英文混合字符串长度和截取字符串 .
- C# 中英文混合字符串截取
- Java截取中英文混合字符串
- Java 截取中英文混合字符串
- js截取中英文混合字符串
- Cocos2dx中英文混合字符串截取
- php截取中英文混合字符串
- 字符串中英文混合前后截取
- Java 截取中英文混合字符串
- Java代码规范文档
- C# 将 HTML 转成纯文本
- LightOJ - 1030 Discovering Gold 期望
- Search a 2D Matrix
- 编程学习之谈
- lua如何截取中英文混合字符串
- struts2基础(1)
- 控件字体大小随内容变化而变化
- 基于android 社区app短信分享 发送回调事件实现
- jstl的formatNumber标签的四舍五入问题
- android使用隐藏api的方法(使用被@hide的api)
- APP 适配 iOS8,位置、通知等特性
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器