Java读取带有补充unicode字符的字符流

时间:2011-10-11 04:12:24

标签: java unicode astral-plane supplementary

我在使用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编码文件?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

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

Java只能将补充字符表示为UTF-16代理对,只要Java值高于0xFFFF,就不会出现“单个字符”(至少在char意义上)。关注。