我在使用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编码文件?
答案 0 :(得分:4)
Java与UTF-16一起使用。因此,如果您的输入流具有星体字符,它们将显示为代理项对,即两个char
s。第一个字符是高代理,第二个字符是低代理。
答案 1 :(得分:1)
虽然read()
被定义为返回int
,理论上可以“一次性”返回一个补充字符的代码点,但我相信返回类型只有int
才允许值-1的返回。
您从read()
获得的值基本上是char
的另一个名称,而Java char
限制为16位。
Java只能将补充字符表示为UTF-16代理对,只要Java值高于0xFFFF,就不会出现“单个字符”(至少在char
意义上)。关注。