【问题标题】:Why Unicode code points are always written with at least 2 bytes?为什么 Unicode 代码点总是用至少 2 个字节编写?
【发布时间】:2019-02-02 03:41:33
【问题描述】:

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

来自Wikipedia page about UTF-8

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

【问题讨论】:

  • 为什么十六进制转义写成\x0A而不是\xA
  • 好问题,我不知道 :)
  • @JoshLee 不幸的是,并不是每个人都将十六进制转义写成 \x0A,C 语言和派生语言确实允许单字符十六进制。两个字节的十六进制只是常见/合理的默认值。对于 Unicode,它已明确定义,请参阅我的回答。
  • 在 C 中,十六进制转义序列由 \x 后跟一个或多个十六进制数字组成。它由不是十六进制数字的第一个字符终止。八进制转义最多有 3 个八进制数字。

标签: unicode encoding utf-8 utf-16


【解决方案1】:

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、 你+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找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2020-02-17
    • 2012-06-20
    • 2013-12-18
    相关资源
    最近更新 更多