`
cwqcwk1
  • 浏览: 86750 次
文章分类
社区版块
存档分类
最新评论

lua匹配UTF-8中文汉字

 
阅读更多
lua5.3虽然支持utf-8,但是自带的string库不支持汉字的处理,而且lua的正则实现也比较鸡肋,很难匹配中文。所以文章讨论UTF-8字符集,中文汉字的表示方法,然后说明lua如何匹配UTF-8中文汉字。

初识UTF-8

UTF-8是Unicode的一种实现,是一种变长字节编码方式。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8最多可用到6个字节。
如表:

因此,UTF-8可以用来表示字符编码最多的有效位数是31位,即x代表的位。除掉那些标志位(如每字节开头的10),UTF-8表示的与Unicode编码是对应的。
另外,Unicode兼容标准的ASCII字符集,只需要一个字节就可以表示所有ASCII码,ASCII码一共规定了128个字符的编码,所以实际只要7位表示。而对于1字节表示的UTF-8编码,字节开头是0,所以UTF-8表示的英文数字,跟ASCII字符集表示的是一样的。


中文UTF-8

通常都说到,汉字范围从0x4E00到0x9FA5,这是指Unicode编码。对于UTF-8还要做转换。
其中,0x4E00 用二进制表示为 100111000000000
换成UTF-8码就是111001001011100010000000,即 228, 184, 128
同理,0x9FA5为 111010011011111010100101,即 233, 190, 165
可以看出,中文UTF-8编码用3个字节表示。


lua匹配UTF-8汉字

前面分析了中文UTF-8的编码范围了,所以lua只要用 string.byte(s, i) 取到字符的byte值(字符集通常记 code point)。比较第一个字节是228-233,而且接下来两个字节都是 128-191,就可以简单认定为中文了。
这里以一个例子说明,比如我要过滤特殊字符,保留中文、英文和数字。
function filter_spec_chars(s)
	local ss = {}
	for k = 1, #s do
		local c = string.byte(s,k)
		if not c then break end
		if (c>=48 and c<=57) or (c>= 65 and c<=90) or (c>=97 and c<=122) then
			table.insert(ss, string.char(c))
		elseif c>=228 and c<=233 then
			local c1 = string.byte(s,k+1)
			local c2 = string.byte(s,k+2)
			if c1 and c2 then
				local a1,a2,a3,a4 = 128,191,128,191
				if c == 228 then a1 = 184
				elseif c == 233 then a2,a4 = 190,165
				end
				if c1>=a1 and c1<=a2 and c2>=a3 and c2<=a4 then
					k = k + 2
					table.insert(ss, string.char(c,c1,c2))
				end
			end
		end
	end
	return table.concat(ss)
end



最后语

题外话,前面写的过滤特殊字符函数,用lua写效率不高,所以我还写了c的版本,有兴趣猛击这里


参考:
http://blog.csdn.net/mycwq/article/details/51303353
http://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html
分享到:
评论

相关推荐

    UTF-8正则表达式如何匹配汉字

    判断输入内容是否含有违法字符,请看下面代码 ...preg_match(/^[\x{4e00}-\x{9fa5}]+$/u,$str)) //UTF-8汉字字母数字下划线正则表达式 { echo 您输入的[.$str.]含有违法字符; } else { echo 您输入的[.$str.

    Lua文件反编译汉字乱码处理

    Lua源代码文件通常采用UTF-8编码,因为它是一种广泛支持的国际标准,可以正确处理各种语言的字符,包括汉字。然而,反编译工具如果不识别或处理这种编码方式,就可能导致乱码。 针对这个问题,我们可以从以下几个...

    utf8.lua:pure-lua 5.3正则表达式库

    总之,`utf8.lua`是一个强大的、纯Lua实现的正则表达式库,特别适合于处理UTF-8编码的文本。其简洁的设计、全面的功能和广泛的兼容性,使得它成为Lua开发者在处理文本模式匹配任务时的一个理想选择。对于需要在各种...

    lua5.3中文手册

    - **UTF-8支持**:对UTF-8编码的支持。 - **表处理**:操作表的各种方法。 - **数学函数**:数学计算相关的函数。 - **输入输出设施**:文件读写等IO操作。 - **操作系统设施**:与操作系统交互的功能。 - **调试库*...

    Lua中获取utf8字符串长度的方法和自定义函数

    在Lua语言中,获取utf8编码字符串的长度并不是直接使用#运算符那么简单,因为utf8编码中一个字符可能由多个字节组成。本文将介绍如何在Lua中获取utf8字符串长度以及如何定义一个自定义函数来正确计算utf8编码字符串...

    Lua5.3参考手册.pdf

    辅助库提供了基础函数、协程管理、模块、字符串处理、UTF-8支持、表处理、数学函数、输入输出设施、操作系统设施和调试库等。标准库则包括了匹配模式、打包和解包格式串等。这些库使开发者可以更轻松地实现各种功能...

    Windows 记事本替代工具 Notepad3 5.21.227.1 + x64.zip

    此外,Notepad3 具有以下功能:代码折叠,括号匹配,自动缩进,字自动完成,转换各种格式(ASCII,UTF-8和UTF-16)之间的字符编码,换行格式转换(在 DOS 之间(CR/LF),Unix(LF)和 Macintosh(CR)格式),多个...

    Friso中文分词器-其他

    功能特性:1、同时支持对 UTF-8/GBK 编码的切分,支持 php5 和 php7 扩展和 sphinx token 插件。2、支持自定义词库。在 dict 文件夹下,可以随便添加/删除/更改词库和词库词条,并且对词库进行了分类。3、简体/繁体/...

    iconv库文件

    在Android系统中,由于其默认采用的是Unicode(通常是UTF-8)编码,但在处理非Unicode编码的数据,如GBK或Big5等时,就可能出现乱码。这时,开发者就需要引入iconv库来实现编码转换。iconv库提供了丰富的接口,可以...

    Redis开发运维

    - **中文字符串处理**:Redis支持UTF-8编码的字符串,可以直接存储中文字符。 - **取指定key的value值的长度**:使用`STRLEN key`命令获取字符串长度。 - **位操作**:使用`GETBIT key offset`命令获取字符串中的某...

Global site tag (gtag.js) - Google Analytics