Lua处理UTF8字符串

项目里遇到用string.sub截取中文字符串会截取出来非空,但是无法展示的情况,进行utf字符串处理后OK.
核心部分是utf字符串的判断:

-- utf-8 字符处理
local function StringToTable(s)
    local tb = {}

    --[[
    UTF8的编码规则:
    1. 字符的第一个字节范围: 0x000x7F(0-127),或者 0xC20xF4(194-244);
    2. UTF8 是兼容 ascii 的,所以 0~127 就和 ascii 完全一致
    3. 0xC0, 0xC1,0xF50xFF(192, 193245-255)不会出现在UTF8编码中
    4. 0x800xBF(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]匹配所有数字 
+是修饰符表示前面的字符出现一次或多次
发布了19 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/hookby/article/details/103644375
今日推荐