2009-11-04 6 views
21

私にÜを含む文字列があるとします。どのようにこれらのユニコード文字を見つけることができますか?私は彼らのコードをテストする必要がありますか?どうすればいい?Java文字列のUnicode文字を検出するにはどうすればよいですか?

たとえば、文字列「AÜXÜ」を指定すると、「AYXY」に変換したいと考えています。私は他のユニコード文字についても同じことをしたいと思いますし、ある種の翻訳マップにそれらを格納しなければならないのは嫌です。

+3

Üが独自のマップなしでどのマップにマップするかをどのように知っていますか?単純なマッピングはありません。異なる言語ではマッピングが異なる可能性があります。 – Mark

+0

実際には、文字を1つずつ見て行うことができます。それはcharの "範囲"に依存しますが、それは静かな低レベルです、そして、私はこのタスクを達成するための何かが既に存在すると仮定します。 http://en.wikipedia.org/wiki/Unicode – Aif

+0

こちらのソリューションもご覧ください:https://rosettacode.org/wiki/Strip_control_codes_and_extended_characters_from_a_string#Java – Stan

答えて

15

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

また、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}+", ""); 
} 

一つの落とし穴を、Üは、それはあなたが後にしているものだ場合Y.わからないではない、Uになります。発音された文字で置き換える場合は、実際にマッピングを作成する必要があります。確かに、それは面倒な作業ですが、このトピックに従う必要がある時間よりも短い時間で完了しています。あなたの文字列による

+0

これは私が通常やった方法です。しかし、これはあなたがマップの各文字を追加する必要があります。 – Geo

+0

特定の文字をある文字と置き換える効率的なオプションはありません。 – BalusC

+1

マップに各キャラクターを追加しない場合、どのように置換を定義しますか?または、ASCII以外の文字をすべてASCII文字1文字で置き換えたいとしますか? –

11

文字がアスキー文字かどうかを尋ねることができます。

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

文字列charを解析する必要があります。あなただけのすべての非ASCIIを交換しようとしている場合 -

1

私はあなたが何をしようとしてあなたの例からわからない(メソッドは、便利なキャラクター方法の負荷が含まれていcommons-lang Charutilsからです) 0から127の範囲外のコードポイントを探して文字列をループし、そのコードポイントをYに置き換えることができます。

12

あなたは可能性がループして、すべての文字コール

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

コードポイントをテストするのは良いことだが、Yのすべての*文字を置き換えたいという印象はない。 – BalusC

+0

彼はユニコード私は彼がおそらくY以外のすべてのアスキー文字を置き換えることを意味することを理解しています。 – jitter

2

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

用語の面では

...

"a" 

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

文字の範囲を英語のアルファベットに制限する場合は、Normalization performed in this answerをご覧ください。

+0

これは単なる置換例です。私は実際に文字を '_XX_'で置き換えます:) – Geo

0

クラスCharacterにも興味深い方法があります。それを見てみましょう。

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

Character.UnicodeBlock.of('�') == Character.UnicodeBlock.BASIC_LATIN; //false 
関連する問題