これは基本的な質問ですが、SAで正確な重複を見つけることができませんでした。
私はこの文字列を持っています:
String s = "surname\":\"B\\u00f6rner\"},{\"forename\""
私が入手したいのは:
String s = "surname\":\"Börner\"},{\"forename\""
Javaでこれを行う方法はありますか?どうも!
バックスラッシュを手動で削除すると、Javaはユニコードをそのように解釈します。API呼び出しから受け取る文字列を変更できない場合は、次を使用できます。
s = s.replaceAll("\\\\u00f6", "\u00f6");
String s = "surname\":\"B\u00f6rner\"},{\"forename\"" ;
try {
String t = URLDecoder.decode(s, "UTF-8") ;
System.out.println(t) ;
}
catch( Throwable t ) {
t.printStackTrace(System.err) ;
}
出力:surname":"Börner"},{"forename"
他の人が言うように、余分な\を削除する方法を見つける必要があります。
Unicodeベースプレーンの外側の文字が必要ない限り、これはそれほど難しいことではありません。
final Matcher m = Pattern.compile("\\\\u(.{4})").matcher(
"surname\":\"B\\u00f6rner\"},{\"forename\"");
final StringBuffer b = new StringBuffer();
while (m.find())
m.appendReplacement(b, String.valueOf(((char)Integer.parseInt(m.group(1), 16))));
m.appendTail(b);
System.out.println(b);
それがJavaソースコードである場合、2つの文字列リテラルはまったく同じことを意味します...(後者の場合)ソースファイルがエンコードされている文字セットをJavaコンパイラに指示する場合nativetoascii
。 command)を使用して、ファイル内のユニコードエスケープをネイティブ文字-reverse
に変換できます。\uxxxx
これらの文字列値が実際には文字列リテラルではなく文字列値である場合は、何らかの実行時変換を行う必要があります。(これを行うためのサードパーティのライブラリメソッドがあると確信しています...)