【问题标题】:Java: why "\uFFFF" converts to [-17, -65, -65] in UTF-8?Java:为什么 "\uFFFF" 在 UTF-8 中转换为 [-17, -65, -65]?
【发布时间】:2014-03-13 14:16:43
【问题描述】:
为什么"\uFFFF"(显然是 2 个字节长)在 UTF-8 中转换为 [-17,-65,-65] 而不是 [-1,-1]?
System.out.println(Arrays.toString("\uFFFF".getBytes(StandardCharsets.UTF_8)));
这是因为对于大于 127 的代码点,UTF-8 在每个字节中仅使用 6 位吗?
【问题讨论】:
标签:
java
unicode
utf-8
character-encoding
【解决方案1】:
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 没有无符号数据类型)。
【解决方案2】:
UTF-8 根据所表示的字符使用不同数量的字节。第一个字节使用 7 位 ASCII 约定以实现向后兼容性。其他字符(如中国符号)最多可占用 4 个字节。
正如维基百科中的链接文章所述,您引用的字符在 3 字节值的范围内。