Unicode与UTF-8编码
Unicode字符集
介绍
ascii编码的字符有限,因此后续各个语言增加了对应的编码字符集。比如GB2312主要针对汉语字符。
这些新增的字符集之间,一般并不兼容,为了能够同时使用不同语言下的字符,比如汉语和日语,设计出了Unicode字符集方案。
Unicode本身并不参与字符在计算机中的字节表示,而是为几乎所有字符统一设计一套编号,具有唯一性。
unicode表示范围
Unicode编码使用两个字节表示,包括集合所有常见字符,中文、日文、俄文等,以及数字运算字符、emoji表情包字符等。但是对于非常小众的语言,存在遗漏是必然的。
unicode查询:https://unicode-table.com/cn/blocks/
字符编码表示
https://unicode-table.com/cn/4E2D/
https://c.runoob.com/front-end/3602/
中 U+4E2D \u4E2D
编码的表示有两种常用写法,十六进制加U+或者\u前缀。
在某些编程语言的代码中(比如js),使用\u前缀声明这是一个unicode字符,编译器将视其为一个字符进行处理。
UTF-8编码
介绍
unicode字符集为字符设置了一个数字编号,但是并未告知具体如何用字节表示。
因此又设计了UTF-8、UTF-16、UTF-32等编码方案。最常用的是UTF-8。
参考:https://baike.baidu.com/item/UTF-8/481798
- 使用1-4个字节灵活编码
- 一个US-ASCIl字符只需1字节编码(Unicode范围由U+0000~U+007F)。
- 带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母则需要2字节编码(Unicode范围由U+0080~U+07FF)。
- 其他语言的字符(包括中日韩文字、东南亚文字、中东文字等)包含了大部分常用字,使用3字节编码。
- 其他极少使用的语言字符使用4字节编码。
- 兼容ascii编码,指的是ascii基础码0-127
编码过程
参考:https://wenku.baidu.com/view/27494fcf9889680203d8ce2f0066f5335a8167a9.html
针对UTF8,编码规则其实只有两条:
1)单字节规则: 对于 单字节 的符号,字节的第?位(最?位)设为 0,后? 7 位为这个符号的 unicode 码。
2)n字节规则: 对于 n 字节的符号(n>1),第?个字节的前 n 位都设为 1,第 n+1 位设为 0,后?字节的前两位?律设为 10。剩下的没有
提及的?进制位,全部为这个符号的 unicode 码。
UTF-8编码中永远不会存在字节FF和FE
优缺点
优点是灵活编码,占用空间较少,尤其是处理英文字符较多的文本时。
缺点是无法根据字符数快速计算其占用字节多少,对于一个字符实际占用的字符数无法直接确定,而需要实际解码才知道。