为什么"\uFFFF"
(显然是2个字节长)在UTF-8中转换为[-17,-65,-65]而不是[-1,-1]?Java:为什么“ uFFFF”在UTF-8中转换为[-17,-65,-65]?
System.out.println(Arrays.toString("\uFFFF".getBytes(StandardCharsets.UTF_8)));
这是因为UTF-8在每个字节中只用了大于127的代码点的6位吗?
为什么"\uFFFF"
(显然是2个字节长)在UTF-8中转换为[-17,-65,-65]而不是[-1,-1]?Java:为什么“ uFFFF”在UTF-8中转换为[-17,-65,-65]?
System.out.println(Arrays.toString("\uFFFF".getBytes(StandardCharsets.UTF_8)));
这是因为UTF-8在每个字节中只用了大于127的代码点的6位吗?
UTF-8使用不同数量的字节,具体取决于表示的字符。第一个字节使用7位ASCII约定来实现向后兼容。其他字符(如中文标志)最多可占用4个字节。
正如维基百科中的链接文章所述,您引用的字符位于3个字节值的范围内。
0xFFFF
具有11111111 11111111
的位模式。根据UTF-8规则分割比特,模式变为1111 111111 111111
。现在添加UTF-8的前缀位,模式变为*1110*1111 *10*111111 *10*111111
,这是0xEF 0xBF 0xBF
,又名239 191 191
,又名-17 -65 -65
,采用二进制补码格式(这是Java用于签名值--Java没有无符号数据类型)。
http://en.wikipedia.org/wiki/UTF-8 – axtavt