如果'ℤ'在BMP中,为什么不用2字节编码?

时间:2016-10-19 06:46:27

标签: java unicode

我的问题来自this answer,其中说:

  

由于'ℤ'(0x2124)位于基本多语言平面中,因此它由单个代码单元表示。

如果这是正确的,那么为什么"ℤ".getBytes(StandardCharsets.UTF_8).length == 3"ℤ".getBytes(StandardCharsets.UTF_16).length == 4

2 个答案:

答案 0 :(得分:5)

似乎你混淆了两件事:字符集(Unicode)和它们的编码(UTF-8或UTF-16)。

0x2124只是Unicode表中的'序列号'。 Unicode只不过是映射到某些字符的一堆“序列号”。这样的序列号称为代码点,它通常写成十六进制数字。

如何对某个数字进行编码,可能会占用比原始代码点更多的字节。

给定字符的UTF-8编码的简短计算:
要知道哪些字节属于同一个字符,UTF-8使用一个系统,其中第一个字节以1位后跟{0位开始一定量(让我们称之为 N )。 1}}位 N 是角色占用的字节数。其余字节( N - 1 )以位10开头。

Hex 0x2124 =二进制100001 00100100

根据上述规则,这将转换为以下UTF-8编码:

11100010 10000100 10100100    <-- Our UTF-8 encoded result
^   ^ ^  ^ ^      ^ ^
AaaaBbDd CcDddddd CcDddddd    <-- Some notes, explained below
  • A是一组后跟零,表示属于该字符的字节数(三个1 s =三个字节)。
  • B是填充,因为否则总位数不能被8整除。
  • C是连接位(每个后续字节以10开头)。
  • D是我们代码点的实际位。

实际上,角色ℤ占用了三个字节。

答案 1 :(得分:1)

并非所有BMP中的字符都使用UTF-8中的两个字节进行编码。 U+4016中的字符使用3个字节进行编码,U+38E2E使用4个字节进行编码。

完整的表格可以在维基百科上的UTF-8文章中找到:

https://en.wikipedia.org/wiki/UTF-8