【问题标题】: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 字节值的范围内。

    【讨论】:

      猜你喜欢
      • 2012-03-26
      • 2017-12-21
      • 1970-01-01
      • 2021-11-20
      • 2012-02-27
      • 2015-11-22
      • 2018-09-18
      • 2017-09-24
      • 1970-01-01
      相关资源
      最近更新 更多