2015-09-17 33 views
0

這是發生了什麼事。在 「лосан」Java String.contains()對西里爾字符串不起作用

用戶類型我有一大堆的產品,其定位是 「лосанджелис」

如果我這樣做:

String userInput = "лос ан" 
for(Product product : products) { 

    if(product.getCity().trim().toLowerCase().contains(userInput.trim().toLowerCase())) { 
     System.out.println("MATCH"); 
    } 

} 

我沒有得到匹配。

這適用於拉丁字符

+1

問題可能不是來自'contains',而是來自'toLowerCase'(語言環境問題)。 – Tunaki

+0

那麼我應該用什麼來代替toLowerCase?我可以做一些無視案件的內容嗎? –

+0

問題是一樣的:無視案件。這是一個取決於語言環境的問題,因爲相同的字符可以根據語言環境進行不同的縮小。您需要向用戶詢問他們的語言並相應地使用它。請參考此答案:http://stackoverflow.com/a/11063161/1743880 – Tunaki

回答

1

嘗試在等式的兩邊在toLowerCase指定區域設置():http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#toLowerCase(java.util.Locale)

+0

我應該爲保加利亞指定什麼區域設置?另外我不知道用戶會輸入什麼語言,所以我希望能夠動態地支持大多數語言。 –

+0

關於「我應該爲保加利亞語指定哪些區域設置」我可以給你一個答案,但你也可以用我做的完全一樣的東西:使用谷歌搜索引擎。關於「其他語言是用戶將要輸入」的 –

+0

,您應該請求用戶正在使用的區域設置。如果這是來自瀏覽器,那麼通常會有一個包含此信息的HTTP標頭。否則,您必須提供條款才能獲取此信息 –

0

使用JDK 1.8.0_45,下面的代碼提供了在這兩種情況下一場比賽:

System.out.println("лос анджелис".trim().toLowerCase().contains("лос ан".trim().toLowerCase())); 
System.out.println("лос анджелис".trim().toLowerCase(Locale.ROOT).contains("лос ан".trim().toLowerCase(Locale.ROOT))); 

正如其他人已經提到的,您可能會尋找一個工作Locale作爲String#toLowerCase的參數。

1

編輯器和編譯器(javac -encoding)必須使用相同的編碼。

編譯器編碼很容易完成。編輯器,源代碼編碼可以使用編程器的編輯器(如可以切換編碼的NotePad ++或JEdit)進行測試。

您也可以U型逃脫Java源代碼的文本進行檢查:

String userInput = "\u043b\u043e\u0441 \u0430\u043d"; 

如果不工作,有編碼之間的差異。

此外String.toLowerCase(new Locale("ru", "RU"))或者已經提到過。

+0

用戶輸入不是硬編碼的字符串,其來自Android編輯文本輸入。我如何逃避它?另外,我不能認爲他們會用俄語寫,因爲下一次有人會用希臘語或亞美尼亞語來寫:( –

+0

這個「解決方案」只能解決Java中的**硬編碼常量**並檢查正確的編碼。可能應該使用UTF-8,Unicode,並檢查數據庫,文件系統,語言環境中的所有內容。 –