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

优缺点

优点是灵活编码,占用空间较少,尤其是处理英文字符较多的文本时。
缺点是无法根据字符数快速计算其占用字节多少,对于一个字符实际占用的字符数无法直接确定,而需要实际解码才知道。

相关