Lua处理UTF8字符串

在项目中遇到使用Lua的string.sub截取中文字符串时出现问题,导致出现不可见字符。通过针对UTF8字符串的处理方法解决了问题。关键在于正确判断和处理UTF8字符串,特别是利用string.gmatch函数进行全局查找和捕获分组,以实现逐字打印和有效截取。

项目里遇到用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]匹配所有数字 
+是修饰符表示前面的字符出现一次或多次
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值