6

Java で UTF-8 でエンコードされたテキストを含む文字列で機能する部分文字列メソッドまたは characterAt メソッドを見つけようとしています。

内部的には、JAVA は UTF-16 で動作します。これは、文字列が 2 バイトのサイズの文字で構成されていることを意味します。UTF-8 文字のサイズは最大 6 バイトです。JAVA がこれを String 内に格納するとき、UTF-8 文字を複数の文字に分割します。

例: 文字 U+20000 (UTF-8 16 進数: F0 A0 80 80) は、2 つの文字 (UTF-16 16 進数: D840 および DC00) を持つ文字列として Java に内部的に保存されます。

4 バイトの UTF-8 文字を含む文字列があり、長さを使用する場合、答えは「2」です。substring(0,1) を使用すると、文字の前半が得られます。

これを説明するコード:

    ByteBuffer inputBuffer = ByteBuffer.wrap(new byte[]{(byte)0xF0, (byte)0xA0, (byte)0x80, (byte)0x80});
    CharBuffer data = Charset.forName("UTF-8").decode(inputBuffer);
    String string_test = data.toString();
    int length = string_test.length();
    String first_half = string_test.substring(0, 1);
    String second_half = string_test.substring(1, 2);
    String full_character = string_test.substring(0, 2);

JAVA は UTF-16 で動作するため、これは予期せぬことであってもバグではありません。固有の UTF-8 サポートは素晴らしいでしょう。しかし、それはありません。

JAVA にはデフォルト ライブラリにクラスがありますか、または UTF-8 サポートを提供するクラスがどこかに存在しますか? 次のように:


  • utf8string.length() -そこ に 4 バイト文字が 1 つある場合は 1 を返します
  • utf8string.getCharacterAt(0) - 前半ではなく、最初の文字を返します。
  • utf8string.substring(0,1) - 前半ではなく、最初の文字を返します。

または、これに対して一般的に使用されるソリューションは何ですか? UTF-8 ファイルを読み取るときに、UTF-16 でサポートされていないすべての UTF-8 文字をデフォルトの UTF-16 文字に変換しますか? その結果、UTF-16 がサポートしていないコードポイント範囲の文字に関するすべての情報が失われますか? それは私の特定の実装では必ずしも問題ではないので、これを行う一般的な方法があれば興味があります。

4

2 に答える 2