2

我在使用 Java 阅读补充 unicode 字符时遇到问题。我有一个文件可能包含补充集中的字符(大于 \uFFFF 的任何字符)。当我设置 InputStreamReader 以使用 UTF-8 读取文件时,我希望 read() 方法为每个补充字符返回一个字符,而不是它似乎在 16 位阈值上拆分。

我看到了一些关于基本 unicode 字符流的其他问题,但似乎没有处理大于 16 位的情况。

这是一些简化的示例代码:

InputStreamReader input = new InputStreamReader(file, "UTF8");
int nextChar = input.read();
while(nextChar != -1) {
    ...
    nextChar = input.read();
}

有谁知道我需要做什么才能正确读取包含补充字符的 UTF-8 编码文件?

4

2 回答 2

4

Java 与UTF-16一起工作。因此,如果您的输入流具有星体字符,它们将显示为代理对,即两个chars。第一个字符是高代理,第二个字符是低代理。

于 2011-10-11T04:24:49.593 回答
1

虽然read()定义为 return int,并且理论上可以“一次”返回补充字符的代码点,但我相信返回类型仅int允许返回 -1 的值。

您从中获得的值read()基本上是 achar的另一个名称,而 Java achar限制为 16 位。

Java 只能将补充字符表示为 UTF-16 代理对,就charJava 而言,一旦超过 0xFFFF 就没有“单个字符”(至少在某种意义上)这样的东西。

于 2011-10-11T04:26:59.583 回答