2

日本語の文字列の特定の位置の文字を取得しようとしています。取得しています

?" 4 バイト専用の Character の代わりに" 。

以下は、実行しようとしているコード スニペットです。

 String jp="";

この文字列の最初の文字を印刷しようとしています

jp.charAt(0)




ouput="?"

適切な解決策をアドバイスしてください。

UTF-8エンコーディングを試しました。

4

1 に答える 1

5

Java では、これらの文字を として表すことはできません。これは、表現charするために 2 つの UTF-16 単位が必要なためです。charAtここでは前半だけを示しますが、それだけでは意味がありません。http://en.wikipedia.org/wiki/UTF-16を参照してください。

次のようなことができます。

import java.lang.Character;

...

    public static String stringAt( String str, int index )
    {
        int codePoint = Character.codePointAt(str, index);
        return new String( Character.toChars(codePoint));
    }

    public static void main(String args[])
    {
         String jp="";


         System.out.println(stringAt(jp, 0)); //Prints 

    }

...

文字をループするには、次のようにします。

    String jp="";
    int len = jp.length();
    for( int i = 0; i < len; ++i) {
        String character = stringAt(jp, i);

        i += ( character.length() -1 );
        System.out.println( character );
    }
    //
    //
    //
    //

ご了承ください:

Java 2 プラットフォームは、char 配列と String および StringBuffer クラスで UTF-16 表現を使用します。

したがって、入力は UTF-8 である可能性がありますが、内部表現とそれに伴う問題は変わりません。UTF-32 だけが真の固定幅エンコーディングであり、1 つの char だけで任意の Unicode 文字を真に表すことができます。

編集:

部分文字列の例 (これは面倒です。おそらく、このためのライブラリを見つけたいと思うでしょう):

public static String substring( String str, int start, int end) {
    int codePointIndex = 0,
        len = str.length();

    StringBuilder sb = new StringBuilder();

    //There's no random access in variable width encoding, so
    //loop must be used
    for( int i = 0; i < len; ++i) {
        String character = stringAt(str, i);
        if( codePointIndex >= start ) {
            sb.append(character);
        }
        if( codePointIndex >= end -1 ) {
            break;
        }
        i += (character.length() - 1);
        codePointIndex++;

    }

    return sb.toString();

}

    String jp = "asdf";
    System.out.println(substring(jp, 0,8)); // asdf
    System.out.println(substring(jp, 0,4)); //as
    System.out.println(substring(jp, 7,8)); //
于 2012-11-12T10:35:33.983 に答える