项目里遇到用string.sub截取中文字符串会截取出来非空,但是无法展示的情况,进行utf字符串处理后OK.
核心部分是utf字符串的判断:
-- utf-8 字符处理
local function StringToTable(s)
local tb = {}
--[[
UTF8的编码规则:
1. 字符的第一个字节范围: 0x00—0x7F(0-127),或者 0xC2—0xF4(194-244);
2. UTF8 是兼容 ascii 的,所以 0~127 就和 ascii 完全一致
3. 0xC0, 0xC1,0xF5—0xFF(192, 193 和 245-255)不会出现在UTF8编码中
4. 0x80—0xBF(128-191)只会出现在第二个及随后的编码中(针对多字节编码,如汉字)
]]
for utfChar in string.gmatch(s, "[%z\1-\127\194-\244][\128-\191]*") do
table.insert(tb, utfChar)
end
return tb
end
逐字打印效果的实现可以借助于 生成的 sTable
-- 参数index是打印字的索引
function class:PopStr(index)
if index == 1 then
_sTable = StringToTable()
end
index = index + 1
if index <= #_sTable then
local str = ""
for i, char in ipairs(_sTable) do
if i <= index then
if char == "[" then
if _sTable[i+1] and _sTable[i+1] == "-" then
index = index+2
else
index = index+7
end
end
str = str .. char
else
break
end
end
return str
end
return false
end
补充strig.gmatch
string.gmatch()创建并返回一个迭代器,可用于for语句中迭代的进行全局查找。
迭代器每执行一次返回一个找到的字符串,如果在模式串中用圆括号指定的匹配分组,
则返回值有多个分别对应各个匹配分组的捕获结果。分组可以相互嵌套,捕获结果返
的顺序对应模式串中匹配分组的左圆括号出现的前后顺序。如果你希望第一个返回值
是匹配结果的完整字符串,那么请将整个模式串包含在一对圆括号内。
strHtmlCode = http.get("http://www.baidu.com")
string.gmatch 全局查找子串,每个括号指定的一个分组匹配(对应一个分组捕获,
在泛型for中增加一个返回值)
与 string.match 不同,string.gmatch发现一个完整匹配以后,会继续向后查找,
pattern = //\s*href\s*=\s*\"?\'?([:\w\./@]+)\"?\'?\s*
for href in string.gmatch(strHtmlCode, pattern) {
我们解释一下模式串 "\s*href\s*=\s*\"?\'?([:\w\./@]+)\"?\'?\s*"
\是转义符
\s表示空白字符
\s*表示空白字符出现一次或多次
\"表示引号
( \转义符的使用与普通字符串相同 )
?表示出现一次或零次
\w表示字母和数字
\.表示.(因为.是特殊字符,所以需要\还原)
[]是一个自定义的字符类,如[0-9]匹配所有数字
+是修饰符表示前面的字符出现一次或多次