Java:为什么“\ uFFFF”在UTF-8中转换为?

为什么"\uFFFF" (显然是2个字节长)在UTF-8中转换为[-17,-65,-65]而不是[-1,-1]?

 System.out.println(Arrays.toString("\uFFFF".getBytes(StandardCharsets.UTF_8))); 

这是因为对于大于127的码点,UTF-8在每个字节中仅使用6位吗?

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没有未签名的数据类型。

UTF-8使用不同的字节数,具体取决于所表示的字符。 第一个字节使用7位ASCII约定来实现向后兼容。 其他字符(如中文符号)最多可占用4个字节。

正如维基百科中的链接文章所述,您引用的字符在3字节值的范围内。