2

Javaを使用して補足のUnicode文字を読み取るのに問題があります。補足セット(\ uFFFFより大きいもの)に文字が含まれている可能性のあるファイルがあります。UTF-8を使用してファイルを読み取るようにInputStreamReaderを設定すると、read()メソッドが補助文字ごとに1文字を返すことを期待しますが、代わりに16ビットのしきい値で分割されるようです。

基本的なUnicode文字ストリームについて他にもいくつか質問がありましたが、16ビットを超える場合は何も処理されていないようです。

簡略化したサンプルコードを次に示します。

InputStreamReader input = new InputStreamReader(file, "UTF8");
int nextChar = input.read();
while(nextChar != -1) {
    ...
    nextChar = input.read();
}

補足文字を含むUTF-8エンコードファイルを正しく読み取るために私が何をする必要があるかを誰かが知っていますか?

4

2 に答える 2

4

JavaはUTF-16で動作します。したがって、入力ストリームにアストラル文字が含まれている場合、それらはサロゲートペアとして、つまり2つcharのとして表示されます。最初の文字は高いサロゲートであり、2番目の文字は低いサロゲートです。

于 2011-10-11T04:24:49.593 に答える
1

を返すようにread()定義されてintおり、理論的には補助文字のコードポイントを「一度に」返すことができますが、戻りタイプはint-1の値を返すことだけを許可するものだと思います。

取得する値read()は基本的にchar別の名前であり、Javaacharは16ビットに制限されています。

charJavaは、補足文字をUTF-16サロゲートペアとしてのみ表すことができます。Javaに関する限り、0xFFFFを超えると、(少なくともある意味では)「単一文字」のようなものはありません。

于 2011-10-11T04:26:59.583 に答える