asBytes
有4个元素,对应32位,这是我们从chars中表示两个16位整数所需的位数,因此是有意义的。
实际上,并不是需要用来表示Java中代码点的char
数量有关。字节数与代码点本身的数字值直接相关。
代码点U+1F701(0x1F701
)使用17位(11111011100000001
)
0x1F701
在UTF-8中需要4个字节(F0 9F 9C 81
)来编码其17位。请参见Wikipedia上的位分布图表。该算法在RFC 3629中定义。
asBytes16
有6个元素,这让我感到困惑。为什么当32位足以表示这个Unicode字符时,我们会多出2个字节?
根据Java文档中对 StandardCharsets
的说明
UTF_16
public static final Charset UTF_16
Sixteen-bit UCS Transformation Format, byte order identified by an optional byte-order mark
0x1F701
需要4个字节的UTF-16编码(D8 3D DF 01
)来表示它的17位。请参见Wikipedia上的位分布图表。该算法在RFC 2781中定义。
与UTF-8不同,UTF-16受endian影响,因此StandardCharsets.UTF_16
包含一个BOM以指定字节数组中实际使用的字节序。
为避免BOM,请根据需要使用StandardCharsets.UTF_16BE
或StandardCharsets.UTF_16LE
:
UTF_16BE
public static final Charset UTF_16BE
Sixteen-bit UCS Transformation Format, big-endian byte order
UTF_16LE
public static final Charset UTF_16LE
Sixteen-bit UCS Transformation Format, little-endian byte order
由于字节顺序已经在名称中暗示了,因此它们不需要在字节数组中包含BOM。