java - 为什么这个 unicode 字符以 UTF-16 编码结束为 6 个字节?

标签 java unicode

我正在玩 this question 的已接受答案中的代码片段.我只是添加了一个字节数组来使用 UTF-16,如下所示:

final char[] chars = Character.toChars(0x1F701);
final String s = new String(chars);
final byte[] asBytes = s.getBytes(StandardCharsets.UTF_8);
final byte[] asBytes16 = s.getBytes(StandardCharsets.UTF_16);

chars 有 2 个元素,在 Java 中这意味着两个 16 位整数(因为代码点在 BMP 之外)。

asBytes 有 4 个元素,对应 32 位,这是我们需要从 chars 中表示两个 16 位整数的内容,所以它是有道理的。

asBytes16 有 6 个元素,这让我很困惑。当 32 位足以表示此 unicode 字符时,为什么我们最终会多出 2 个字节?

最佳答案

UTF-16 字节以 Byte order mark 开头FEFF 表示该值以大端编码。根据 wiki BOM 也用于区分 UTF-16 和 UTF-8:

Neither of these sequences is valid UTF-8, so their presence indicates that the file is not encoded in UTF-8.

您可以根据 this answerbyte[] 转换为十六进制编码的 String :

asBytes   = F09F9C81
asBytes16 = FEFFD83DDF01

关于java - 为什么这个 unicode 字符以 UTF-16 编码结束为 6 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54038562/

相关文章:

java - 为什么 2 的 31 次方在这个 Java 函数中返回负数?

java - 如何对不同的包进行不同的日志记录?

java - Ant 构建成功,但 Eclipse 显示错误。 (Eclipse/Java 新手)

java - 当消息采用俄语 unicode 时,如何避免消息中出现单引号?

java - 强制用户输入和文件读取器输入的编码标准化

python - 是否有与英文字母相似的字符列表?

java - richfaces suggestionBox 将附加值传递给支持 bean

java - 如何使用返回 HTTP 301 的架构 URL 验证 XML?

python - 相当于 python 2.x 中 unicode 字符串的 string.ascii_letters?

java - Windows 记事本 "Unicode Encoding"的 Java 等效项是什么?