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

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

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

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

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

Java只能将补充字符表示为UTF-16代理对,就Java而言,一旦达到0xFFFF以上就没有“单字符”(至少在char意义上)。