Lua 删除UTf-8编码中的特殊字符
来源:互联网 发布:机顶盒有必要买吗 知乎 编辑:程序博客网 时间:2024/05/17 21:40
首先,我们要对UTF-8有一个基本的认识,根据Wiki上面的解释:
UTF-8使用一至六个字节为每个字符编码(尽管如此,2003年11月UTF-8被RFC 3629重新规范,只能使用原来Unicode定义的区域,U+0000到U+10FFFF,也就是说最多四个字节):
1. 128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。
2. 带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要两个字节编码(Unicode范围由U+0080至U+07FF)。
3. 其他基本多文种平面(BMP)中的字符(这包含了大部分常用字,如大部分的汉字)使用三个字节编码(Unicode范围由U+0800至U+FFFF)。
4. 其他极少使用的Unicode 辅助平面的字符使用四至六字节编码(Unicode范围由U+10000至U+1FFFFF使用四字节,Unicode范围由U+200000至U+3FFFFFF使用五字节,Unicode范围由U+4000000至U+7FFFFFFF使用六字节)。
x
字符表示码点占据的位 )0xxxxxxx
110xxxxx
10xxxxxx
1110xxxx
10xxxxxx
10xxxxxx
11110xxx
10xxxxxx
10xxxxxx
10xxxxxx
111110xx
10xxxxxx
10xxxxxx
10xxxxxx
10xxxxxx
1111110x
10xxxxxx
10xxxxxx
10xxxxxx
10xxxxxx
10xxxxxx
- 在ASCII码的范围,用一个字节表示,超出ASCII码的范围就用字节表示,这就形成了我们上面看到的UTF-8的表示方法,这様的好处是当UNICODE文件中只有ASCII码时,存储的文件都为一个字节,所以就是普通的ASCII文件无异,读取的时候也是如此,所以能与以前的ASCII文件兼容。
- 大于ASCII码的,就会由上面的第一字节的前几位表示该unicode字符的长度,比如110xxxxx前三位的二进制表示告诉我们这是个2BYTE的UNICODE字符;1110xxxx是个三位的UNICODE字符,依此类推;xxx的位置由字符编码数的二进制表示的位填入。越靠右的x具有越少的特殊意义。只用最短的那个足够表达一个字符编码数的多字节串。注意在多字节串中,第一个字节的开头"1"的数目就是整个串中字节的数目。
有了基本的认识之后,我们现在假设,只需要一个字节或三个字节的长度的字符。为了判断一个字符是多少个字节,我们需要一个函数来判断UTF-8的第一个字节的连续的1的位有多少个(从最高位开始):
Lua5.3版本
--获取一个字节中,从最高位开始连续的1的个数function get_continuous_1_count_of_byte(num) if nil == num then return -1 end local count = 0 while (num & 0x80 ~= 0) do count = count + 1 num = num << 1 end return countend
-- 删除字符串中的特殊字符,特殊字符指代 utf-8 编码中字节数大于或等于4个字节和2个字节的的符号function delete_special_char(raw_string) if nil == raw_string or string.len(raw_string) == 0 then return raw_string end local new_string = {} local index_of_raw_string = 1 while index_of_raw_string <= string.len(raw_string) do local count_1_of_byte = get_continuous_1_count_of_byte(string.byte(raw_string, index_of_raw_string)) if count_1_of_byte < 0 then return raw_string end if 0 == count_1_of_byte then count_1_of_byte = 1 end if count_1_of_byte <= 3 and count_1_of_byte ~= 2 then for i = 0, count_1_of_byte - 1 do table.insert(new_string, string.char(string.byte(raw_string, index_of_raw_string + i))) end end index_of_raw_string = index_of_raw_string + count_1_of_byte end return table.concat(new_string)end
这样就只剩下BMP和ASCII码的字符了。
阅读全文
0 0
- Lua 删除UTf-8编码中的特殊字符
- utf-8 特殊字符过滤
- 删除字符串中的特殊字符
- Java中的ASCII、Unicode和UTF-8字符编码集
- Java中的ASCII、Unicode和UTF-8字符编码集
- Java中的ASCII、Unicode和UTF-8字符编码集
- Java中的ASCII、Unicode和UTF-8字符编码集
- Java中的ASCII、Unicode和UTF-8字符编码集
- Java中的ASCII、Unicode和UTF-8字符编码集
- Java中的ASCII、Unicode和UTF-8字符编码集
- Java中的ASCII、Unicode和UTF-8字符编码集
- Java中的ASCII、Unicode、UTF-8字符编码集
- Java中的ASCII、Unicode和UTF-8字符编码集
- Java中的ASCII、Unicode和UTF-8字符编码集
- Java中的ASCII、Unicode和UTF-8字符编码集
- UTF-8编码的特殊字符,在GBK下显示?的问题
- python替换UTF-8编码文本中任意特殊字符,包括中文符号
- 字符编码之UTF-8
- 有关Qt 32和64位
- 盒子模型和CSS3的box-sizing属性
- try,catch和finally的执行顺序
- linaCharts开发笔记:面拉伸成体
- 斜率优化
- Lua 删除UTf-8编码中的特殊字符
- day12_01文件
- 牛客网---2016---蘑菇街最大间隔
- leetcode 390. Elimination Game
- Python Mysqldb使用简介
- 欧拉函数:HDU1787-GCD Again(欧拉函数的模板)
- php实现无限级分类查询(递归、非递归)
- 笨方法学Python 习题 22: 到现在你学到了哪些东西?
- 2017杭电多校第一场02