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

Kev*_*ede 2 java unicode

我的问题来自于这个答案,其中说:

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

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

MC *_*ror 6

看起来你混淆了两件事:字符集(Unicode)和它们的编码(UTF-8或UTF-16).

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

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


给定字符的UTF-8编码的简短计算:
为了知道哪些字节属于同一字符,UTF-8使用一个系统,其中第一个字节以一定量(称为N)开始,1后跟一个0位.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
Run Code Online (Sandbox Code Playgroud)
  • A是一组后跟零的一组,表示属于该字符的字节数(三个1s =三个字节).
  • B 是填充,因为否则总位数不能被8整除.
  • C是连接位(每个后续字节以10)开头.
  • D 是我们代码点的实际位.

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