【发布时间】:2013-06-28 09:14:17
【问题描述】:
G-Clef (U+1D11E) 不是Basic Multilingual Plane (BMP) 的一部分,这意味着它需要超过 16 位。几乎所有 Java 的读取函数都只返回一个 char 或一个 int 还包含 only 16 bit。哪个函数可以读取完整的 Unicode 符号,包括 SMP、SIP、TIP、SSP 和 PUA?
更新
我问过如何从输入流中读取单个 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);
}
剩下的问题:演员阵容安全吗?或者如何避免他们?
【问题讨论】:
-
标题中不需要添加major标签。
-
可能的重复不包含答案。
-
你的两个答案都是“正确的”(尽管第一个不处理流的结尾)。你的演员阵容没有什么不安全的。