G-Clef(U + 1D11E)はBasic Multilingual Plane(BMP)の一部ではないため、16ビット以上必要です。ほとんどのJavaの読み取り関数は、char
またはint
にはonly 16 bitも含まれています。 SMP、SIP、TIP、SSP、PUAを含む完全なUnicodeシンボルを読み取る関数はどれですか?ファイルからUnicode G音部記号(U + 1D11E)を読み取る方法は?
更新
私は、入力ストリームから単一の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);
}
残りの質問:キャストが安全であるか、どのようにそれらを避けるために?
を使用することができますでき保証はタイトルに主要なタグを追加する必要はありません。 –
[Unicode文字を含む文字ストリームでのJava読み込み]の複製が可能です(http://stackoverflow.com/questions/7721293/java-reading-in-character-streams-with-supplementary-unicode-characters) –
可能な複製答えを含んでいません。 – ceving