2014-10-30 50 views
9

關於爲什麼以及何時java.lang.String.equalsIgnoreCase由於錯誤使用語言環境而失敗,有很多很多例子。什麼是Java的equalsIgnoreCase的正確選擇?

但我沒有找到任何正確方法的例子。與java.lang.String.toUpperCase不同,沒有帶語言環境參數的版本。將兩個字符串轉換爲大寫或小寫似乎都是浪費。特別是當你正在進行大量比較的應用程序時。

在考慮區域設置和性能的情況下,忽略大小寫字符串比較的正確方法是什麼?

+1

也許通過使用['Collat​​or'](http://docs.oracle.com/javase/8/docs/api/java/text/Collat​​or.html)? – fge 2014-10-30 07:05:40

+2

你介意用'.equalsIgnoreCase()'的錯誤結果來編輯你的問題嗎?我很好奇...... – fge 2014-10-30 07:33:42

+0

@fge土耳其語«我»和德語«ß»似乎是引用最多的失敗。但是你說得對,我稍後添加一些例子。 – Martin 2014-10-30 11:44:35

回答

1

this page,您可以使用分頁器做區分大小寫平等如下:

//retrieve the runtime user's locale 
Locale locale = new Locale(getUserLocale()); 

//pass the user's locale as an argument 
Collator myCollator = Collator.getInstance(locale); 

//set collator to Ignore case but not accents 
//(default is Collator.TERTIARY, which is 
//case sensitive) 
myCollator.setStrength(Collator.SECONDARY); 

int i = myCollator.compare(stringA,stringB); 

(從上述網站複製...)

顯然,在其他情況下你可能會選擇區域設置不同。


For @fge - 此Oracle錯誤報告舉例說明了發生的事情。

+0

感謝您的示例!並花時間來實際找到一些代碼... – fge 2014-10-30 11:57:42

0

可行的替代方案可能會被濫用正則表達式。這是相當性能密集型與動態變化的字符串,但如果你對常量比較它可能是一種替代方案:

Matcher matcher = Pattern.compile("^" + myOtherString + "$", 
    Pattern.CASE_INSENSITIVE | Pattern.LITERAL | Pattern.UNICODE_CASE).matcher(); 
if (matcher.matches(myString)) { 
    // ... 
} 

此錨要比較對字符串,指定Unicode的大小寫不敏感字符串的匹配。

+0

我預測會有與使用String.equalsIgnoreCase相同的問題。比較需要區域識別,而不僅僅是支持Unicode。 ('String.equalsIgnoreCase'也是Unicode的意識......根據'String' javadocs。) – 2014-10-30 13:07:13

+0

@StephenC這個很酷的部分是,在你的答案中給出的例子不會有同樣的問題。 ß - > SS問題來自於沒有大寫字母等同於ß的事實。只有ß將匹配ß和ss將**不匹配ß(因爲它發生在equalsIgnoreCase();)中) – Vogel612 2014-10-30 13:21:30