web-dev-qa-db-ja.com

Java文字列内のUnicode文字を検出するにはどうすればよいですか?

Üを含む文字列があるとします。これらすべてのUnicode文字をどのように見つけるのですか?コードをテストする必要がありますか?どうすればいいですか?

たとえば、文字列「AÜXÜ」が与えられた場合、それを「AYXY」に変換したいと思います。他のUnicode文字についても同じことをしたいのですが、それらをある種の翻訳マップに保存する必要はありません。

22
Geo

「Unicode文字」の定義はあいまいですが、標準でカバーされていないUTF-8文字を意味すると解釈されます ISO 8859文字セット 。これが当てはまる場合は、文字列内のすべての文字をループし、そのコードポイントをテストして、指定された文字セット内にあるかどうかを判断します。

または、一致するキーを含むMap<Character, Character>および文字をマップで使用します。例えば:

Map<Character, Character> charReplacementMap = new HashMap<Character, Character>() {{
    put('Ü', 'Y');
    // Put more here.
}};

String originalString = "AÜAÜ";
StringBuilder builder = new StringBuilder();

for (char currentChar : originalString.toCharArray()) {
    Character replacementChar = charReplacementMap.get(currentChar);
    builder.append(replacementChar != null ? replacementChar : currentChar);
}

String newString = builder.toString();

または、「発音区別符号付きのすべてのキャラクター」を意味しますか?その場合は、 Java.text.Normalizer を使用して発音区別符号を削除します。

/**
 * Remove any diacritical marks (accents like ç, ñ, é, etc) from
 * the given string (so that it returns plain c, n, e, etc).
 * @param string The string to remove diacritical marks from.
 * @return The string with removed diacritical marks, if any.
 */
public static String removeDiacriticalMarks(String string) {
    return Normalizer.normalize(string, Form.NFD)
        .replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
}

1つの落とし穴、ÜはYではなくUになります。それがあなたが求めているものかどうかはわかりません。発音された文字に置き換えたい場合は、実際にマッピングを作成する必要があります。確かに、それは退屈な作業ですが、このトピックに従うのに必要な時間よりも短い時間で完了します。

15
BalusC

文字列をループして、文字を呼び出すたびにループすることができます

If (Character.UnicodeBlock.of(c) != Character.UnicodeBlock.BASIC_LATIN) {
 // replace with Y
}
14
jitter

逆に行って、文字がアスキー文字かどうかを尋ねることもできます。

public static boolean isAscii(char ch) {
    return ch < 128;
}

もちろん、文字列を文字ごとに分析する必要があります。

(メソッドは commons-lang CharUtils からのもので、便利なCharacterメソッドがたくさん含まれています)

12
msp

「AÜXÜ」を「AYXY」に変換することで何が得られるのか、正確にはわかりません。これは、Üが特定の言語でYのように発音されるためですか?何語?そして、他にどのようなルールが適用される可能性がありますか?


用語に関して...

"a"

上記はUnicode文字列です。これには、UTF-16でエンコードされた単一の文字が含まれています。

文字の範囲を英語のアルファベットに制限したい場合は、 この回答で実行される正規化 を参照してください。

2
McDowell

あなたの例からあなたが何をしようとしているのかわかりません-あなたがすべての非ASCII値をYで置き換えようとしているだけなら、0から127の範囲外のコードポイントを探す文字列をループすることができます、それらのコードポイントをYに置き換えます。

1
Dominic Rodger

クラスCharacterは、いくつかの興味深いメソッドも提供します。それを見てください。

Character.UnicodeBlock.of('a') == Character.UnicodeBlock.BASIC_LATIN; //true

Character.UnicodeBlock.of('�') == Character.UnicodeBlock.BASIC_LATIN; //false
0