我的问题来自this answer,其中说:
由于'ℤ'(0x2124)位于基本多语言平面中,因此它由单个代码单元表示。
如果这是正确的,那么为什么"ℤ".getBytes(StandardCharsets.UTF_8).length == 3
和"ℤ".getBytes(StandardCharsets.UTF_16).length == 4
?
答案 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文章中找到: