为什么Unicode代码点总是至少写2个字节?

时间:2018-08-27 14:59:23

标签: unicode encoding utf-8 utf-16

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

来自Wikipedia page about UTF-8

$ -> U+0024
¢ -> U+00A2 

1 个答案:

答案 0 :(得分:6)

TL; DR这都是Unicode联盟的约定。

这是Appendix A: Notational Conventions of the Unicode standard (I've referenced the latest at this time, version 11)中的正式定义:

  

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


它们是十六进制数字,代表Unicode标量值。最初,只有第一个平面称为基本多语言平面,该平面支持定义的U+0000U+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编码(大或小端序)。但是,基本多语言平面中的字符编码与十六进制的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)

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


可以在at sil.org中找到很多此类信息。