2010-11-29 64 views
6

可能重複:
Java. Ignore accents when comparing strings
Java string searching ignoring accentsJava的Unicode比較

大家好

我需要比較Java中的字符串,可能是像 '克洛伊' 和「Chloé的」。 我需要他們是平等的。 任何人都知道最佳實踐是什麼?還是有一些第三方庫?

羅馬

+2

其實,他們是不相等的,除非第二個是對法國英文版(這意味着,你必須翻譯它並做一個比較)。 – 2010-11-29 11:52:06

回答

3

我們比較前字符串「Chloé的」到「克洛伊」的特殊字符及其等價的ASCII字符之間的硬編碼映射轉換。這很好,但很笨拙,可能還有一些我們已經遺忘的特殊字符。

我們的解決方案看起來是這樣的:

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

對我來說看起來像一個可能的解決方案,但我真的很好奇這個的性能,我將在最後比較很多字符串 – Roman 2010-11-29 12:28:26

+1

這個特殊的例子可以用`java.text.Normalizer`來代替。另見[這個答案](http://stackoverflow.com/questions/2397804/java-string-searching-ignoring-accents/2397830#2397830)。 – BalusC 2010-11-29 12:37:07

+0

在我們的例子中,性能還不錯,因爲它沒有被調用很多次。 – 2010-11-29 12:48:48

9

看看International Components for Unicode,它可以做你需要的。

編輯:這裏是讓你開始一些示例代碼(從校書郎的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

什麼stripAccent從Apache的百科全書?

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 

他們不提Unicode編碼(只要能給HTML的例子),你可能會想給它一個想試試