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
意义上)。