G-Clef(U+1D11E)不属于基本多语言平面(BMP),这意味着它需要超过16位。几乎所有的Java读取函数都只返回一个
使用
我该如何做得更好? 更新2 另一个版本返回一个字符串,但仍然使用强制类型转换:
剩下的问题是:铸件是否安全,或如何避免它们?
char
或一个同时包含仅16位的int
。哪个函数可以读取包括SMP、SIP、TIP、SSP和PUA在内的完整Unicode符号?
更新
我想知道如何从输入流中读取单个Unicode符号(或码点)。我既没有任何整数数组,也不想读取一行。使用
Character.toCodePoint()
可以构建代码点,但此函数需要一个char
。另一方面,读取char
是不可能的,因为read()
返回一个int
。到目前为止,我最好的解决方法是这样的,但它仍然包含不安全的转换:public int read_code_point (Reader input) throws java.io.IOException
{
int ch16 = input.read();
if (Character.isHighSurrogate((char)ch16))
return Character.toCodePoint((char)ch16, (char)input.read());
else
return (int)ch16;
}
我该如何做得更好? 更新2 另一个版本返回一个字符串,但仍然使用强制类型转换:
public String readchar (Reader input) throws java.io.IOException
{
int i16 = input.read(); // UTF-16 as int
if (i16 == -1) return null;
char c16 = (char)i16; // UTF-16
if (Character.isHighSurrogate(c16)) {
int low_i16 = input.read(); // low surrogate UTF-16 as int
if (low_i16 == -1)
throw new java.io.IOException ("Can not read low surrogate");
char low_c16 = (char)low_i16;
int codepoint = Character.toCodePoint(c16, low_c16);
return new String (Character.toChars(codepoint));
}
else
return Character.toString(c16);
}
剩下的问题是:铸件是否安全,或如何避免它们?
UTF-16
解码为代码点,反之亦然... - JosefZ