Unicode编码原创
正则的Unicode
如何处理Unicode编码的文本
- Unicode对世界上的大部分文字进行整理编码,使得计算机呈现和处理文字变得简单
- 使用四个字节表示一个字符,目前分为了17个组,每组拥有2^16个码值。
- 我们用到的大多数字符属于0号平面(BMP),其他平面称为补充平面
- Unicode将字符编码为对应的码值,UTF将码值编码为字节形式传输和存储。
- Unicode兼容ASCLL编码,在表示纯英文时 不会占据更多存储空间,汉字通常是三个字节表示。
- 处理多字节文本时最好指定unicode
UTF编码
- 将Unicode码值编码成字节的形式
- 常见的编码方式有UTF-8,UTF-16,UTF-32等
- UTF-8编码采用的是变长的方式,即Unicode会被编码成占用1~4个字节的二进制。
- Unicode将所有的文字编码成16进制码值,UTF将所有的码值编码成变长的2进制字节
Unicode正则匹配
- 在编程语言中使用正则时,最好使用unicode编码
- 如果不采用unicode编码,在匹配时正则会被编译成其他的形式,比如macos中的UTF-8,windows中的GBK
- 除了指定正则的编码形式,进行匹配的文字也需要指定为Unicode,才能正常匹配
- 当不指定unicode时,直接编码成UTF-8时,进行匹配时对编码后的字节划分方式的不同会导致匹配出错
- 案例
- “时间” 匹配 “极客”
- UTF编码:时间——>\xe6\x97\xb6
- UTF编码:极客——>\xe6\x9e\x81
- 均含有\xe6,则会匹配成功
- Unicode:则不会匹配成功
- 点号匹配:在JavaScript中支持匹配任意unicode字符
- 字符组匹配:自行测试\w,\d,\s等
Unicode属性
- 正则中使用Unicode,可能会用到unicode中的属性,这些属性把unicode分成了不同的字符集合
- 通过属性来匹配不同分类的unicode字符
- 字符功能:\p{P}标点符号,\p{N}数字字符
- 连续区间:\p{Arrows}箭头符号,\p{Bopomofo}注音符号
- 书写系统:\p{Han}汉语
- 正则中属性的表示方式都为\p{属性}
- /\p{Han}+/ 匹配所有的汉字
- 表情符号匹配建议使用表情库
- 对于unicode属性大部分语言都不支持