【问题标题】:Character streams. Data dealt with is 16-bit Unicode characters. Is it truth?字符流。处理的数据是 16 位 Unicode 字符。是真的吗?
【发布时间】:2014-07-08 19:27:53
【问题描述】:
最近看了whats-the-difference-between-unicode-and-utf8和相关话题。
现在我正在阅读有关字符流的书籍并阅读以下内容:
处理的数据是 16 位 Unicode 字符。
据我了解,“16 位 Unicode 字符”是指 utf-16。如果我没有显式设置编码,那么 java 使用默认操作系统编码,但我可以使用 InputStreamReader/OutputStreamWriter 显式设置编码。
我不明白 Data dealt with is 16-bit Unicode characters. 关于字符流的某些内容或短语不正确?
【问题讨论】:
标签:
java
unicode
utf-8
io
【解决方案1】:
计算机唯一知道的是 1 和 0。指定编码是告诉 JVM 如何“解释”或“解密”1 和 0 的方式。如果您在 UTF 8 数据的 InputStream 上使用 UTF-16 编码,您的“解密”算法显然与“加密”算法不匹配,并且您会得到到处都是有趣的字符。
【解决方案2】:
“处理的数据是 16 位 Unicode 字符”意味着数据是 16 位 代码单元。每个单元要么是代理代码单元,要么代表基本多语言平面 (BMP) 中的字符,范围为 U+0000 到 U+FFFF。这样的代理代码单元不代表任何东西;只有一对代理代码单元可能有意义,表示 BMP 之外的一个字符。
因此,“字符”不一定是字符,即使我们可以将它们称为“Java 字符”。
当您读取 UTF-8 编码文件时,您应该使用为您解释 UTF-8 编码数据并生成 16 位代码单元的例程。
【解决方案3】:
“16 位 Unicode 字符”是 Java char 的冗余同义词。 char 是一个无符号的 16 位值,正如您所推测的,一个字符序列是一个 UTF-16 编码的字符串。
短语“处理的数据是 16 位 Unicode 字符”是指 Reader 或 Writer 仅读取或写入 char 值(或保存 char 值的 int)。
当代码使用 Reader 或 Writer 时,编码不是一个考虑因素,因为它只适用于 char 值。正如您所说,编码仅在您创建包装 InputStream 或 OutputStream 的 Reader 或 Writer 时才重要——特别是在创建 InputStreamReader 或 OutputStreamWriter 时。