首页 > 解决方案 > 为什么说:CharacterStream 类用于执行 16 位 Unicode 字符的输入/输出?

问题描述

标签: javaencodingjava-streambytejava-io

解决方案


在 Java 中,aString由一系列 16 位char的 s 组成,表示以 UTF-16 编码存储的文本。

ACharset是描述如何将 Unicode 字符转换为字节序列的对象。UTF-8 是字符集的一个示例。

一个像 的字符流Writer,当它输出到一个包含字节的东西——一个文件,或者像一个字节输出流OutputStream——时,使用 aCharsetStrings 转换为简单的字节序列进行输出。(从技术上讲,它将 UTF-16 字符转换为 Unicode 字符,然后将其转换为带有 . 的字节序列Charset。) AReader从字节源读取时,会进行反向转换。

在 UTF-16 中,Ạ 表示为 16 位char 0x1EA1。它在 UTF-16 中只需要 16 位,而不是 UTF-8 中的 24 位。

如果您使用 UTF-8 编码将其转换为字节,如下所示:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
Writer writer = new OutputStreamWriter(baos, StandardCharsets.UTF_8);
writer.write("Ạ");
writer.close();
return baos.toByteArray();

然后您将按预期获得 3 字节序列 0xE1 0xBA 0xA1。


推荐阅读