日本語の文字列の特定の位置の文字を取得しようとしています。取得しています
?"
4 バイト専用の Character の代わりに" 。
以下は、実行しようとしているコード スニペットです。
String jp="";
この文字列の最初の文字を印刷しようとしています
jp.charAt(0)
ouput="?"
適切な解決策をアドバイスしてください。
UTF-8
エンコーディングを試しました。
日本語の文字列の特定の位置の文字を取得しようとしています。取得しています
?"
4 バイト専用の Character の代わりに" 。
以下は、実行しようとしているコード スニペットです。
String jp="";
この文字列の最初の文字を印刷しようとしています
jp.charAt(0)
ouput="?"
適切な解決策をアドバイスしてください。
UTF-8
エンコーディングを試しました。
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)); //