为什么Unicode代码点始终写入至少2个字节?

Rad*_*eve 3 unicode encoding utf-8 utf-16

为什么Unicode代码点总是用2个字节(4位)写,即使没有必要?

从Wikipedia页面了解UTF-8:

$ -> U+0024
¢ -> U+00A2 
Run Code Online (Sandbox Code Playgroud)

Maa*_*wes 7

TL; DR这是Unicode Consortium的惯例.

这是正式的定义,见附录A:Unicode标准的符号约定(我在这个时候引用了最新版本,第11版):

在运行文本中,单个Unicode代码点表示为U + n,其中n是四到六个十六进制数字,使用数字0-9和大写字母A-F(分别为10到15).省略前导零,除非代码点具有少于四个十六进制数字 - 例如,U + 0001,U + 0012,U + 0123,U + 1234,U + 12345,U + 102345.


它们是十六进制数字,表示Unicode标量值.最初只有第一平面称为基本多文种平面都有了,该支持的范围U+0000来U+FFFF加以界定.因此,最初U +编码总是有4个十六进制字符.

但是,这仅允许64 Ki(65536)个代码点用于字符(不包括某些保留值).因此单机后来扩展到17架飞机.对于值U+10000或更高的值,前导零被抑制,因此下一个字符被写为U+10000,而不是U+010000.目前有17个64Ki代码点的平面(其中一些可能被保留),从U + 0000,U + 10000 ... U + 90000开始,最后是U100000.

U + xxxx表示法不遵循UTF-8编码.它也不遵循UTF-16,UTF-32或弃用的UCS编码,无论是大端还是小端.但是,Basic Multilingual Plane中的字符编码与十六进制的UTF-16(BE)相同.请注意,UTF-16可能包含代理代码单元,这些代理单元用作转义以对其他平面中的字符进行编码.这些代码单元的范围不映射到字符,因此不会出现在文本代码点表示中.

见例如,正负号,±:

Unicode code point: U+00B1 (as a textual string)
UTF-8             : 0xC2 0xB1 (as two bytes)
UTF-16            : 0x00B1
UTF-16BE          : 0x00B1 as 0x00 0xB1 (as two bytes)
UTF-16LE          : 0x00B1 as 0xB1 0x00 (as two bytes)
Run Code Online (Sandbox Code Playgroud)

https://www.fileformat.info/info/unicode/char/00b1/index.htm


大部分信息可以在sil.org上找到.