2010-11-29 13 views
6

重複の可能性:私は 'クロエ' や「クロエのようであるかもしれないJavaで文字列を比較する必要が
Java. Ignore accents when comparing strings
Java string searching ignoring accentsのJava Unicodeの比較

こんにちはすべて

' 私はそれらが等しいことが必要です。 誰もがベストプラクティスを知っていますか?または、サードパーティのライブラリがありますか?

ローマ

+2

とにかく試してみるすることもできますUnicodeエンコーディングに言及(とのみHTMLの例を与える)していない第二はフランスでない限り、彼らは、同じではありません英語のもの(つまり、翻訳して比較する必要があります)。 –

答えて

3

私たちは、比較の前に、特殊文字とそれに相当するASCII文字の間にハードコーディングされたマッピングで「クロエ」に文字列「クロエ」を翻訳します。それはかなりうまくいくが、不器用で、おそらく、我々が忘れてしまったいくつかの特殊文字があるだろう。

当社のソリューションは、このようなものになります。だから私はこの1つの良い答えについて興味

public static String replaceAccents(String string) { 
    String result = null; 

    if (string != null) { 
    result = string; 

    result = result.replaceAll("[àáâãåä]", "a"); 
    result = result.replaceAll("[ç]", "c"); 
    result = result.replaceAll("[èéêë]", "e"); 
    result = result.replaceAll("[ìíîï]", "i"); 
    result = result.replaceAll("[ñ]", "n"); 
    result = result.replaceAll("[òóôõö]", "o"); 
    result = result.replaceAll("[ùúûü]", "u"); 
    result = result.replaceAll("[ÿý]", "y"); 

    result = result.replaceAll("[ÀÁÂÃÅÄ]", "A"); 
    result = result.replaceAll("[Ç]", "C"); 
    result = result.replaceAll("[ÈÉÊË]", "E"); 
    result = result.replaceAll("[ÌÍÎÏ]", "I"); 
    result = result.replaceAll("[Ñ]", "N"); 
    result = result.replaceAll("[ÒÓÔÕÖ]", "O"); 
    result = result.replaceAll("[ÙÚÛÜ]", "U"); 
    result = result.replaceAll("[Ý]", "Y"); 
    } 

    return result; 
} 

を!

+0

私には可能な解決策のように見えますが、私はこの1つのパフォーマンスについて本当に好奇心です。最後にたくさんの文字列を比較します。 – Roman

+1

この特定の例は 'java.text.Normalizer'に置き換えることができます。 [この回答](http://stackoverflow.com/questions/2397804/java-string-searching-ignoring-accents/2397830#2397830)も参照してください。 – BalusC

+0

私たちのケースでは、何度も呼び出されないので、パフォーマンスはOKです。 –

9

International Components for Unicodeをご覧ください。必要な処理を行うことができます。

編集:ここにいくつかのサンプルコードは(のCollat​​orのJavadocから)あなたが始めるためにです:

// Get the Collator for US English and set its strength to PRIMARY 
Collator usCollator = Collator.getInstance(Locale.US); 
usCollator.setStrength(Collator.PRIMARY); 
if (usCollator.compare("abc", "ABC") == 0) { 
    System.out.println("Strings are equivalent"); 
} 
+0

これは唯一の正解です。 – tchrist

0

何のApache CommonsのからstripAccentについて?

Removes the accents from a string. 

NOTE: This is a JDK 1.6 method, it will fail on JDK 1.5. 

StringUtils.stripAccents(null)    = null 
StringUtils.stripAccents("")     = "" 
StringUtils.stripAccents("control")   = "control" 
StringUtils.stripAccents("&ecute;clair")  = "eclair" 


Parameters: 
    input - String to be stripped 
Returns: 
    String without accents on the text 

彼らは、あなたがそれを実際に

+0

いいですね。残念ながら、commons-lang 3.0はいつまでもベータ状態になっています...彼らが最終的にその新しいバージョンをリリースする時期は誰が知っていますか? –