我的问题来自于这个答案,其中说:
由于'ℤ'(0x2124)在基本多语言平面中,因此它由单个代码单元表示.
如果这是正确的,那为什么是"?".getBytes(StandardCharsets.UTF_8).length == 3和"?".getBytes(StandardCharsets.UTF_16).length == 4?
看起来你混淆了两件事:字符集(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 是我们代码点的实际位.实际上,角色ℤ占用了三个字节.
| 归档时间: |
|
| 查看次数: |
125 次 |
| 最近记录: |