我認爲你應該使用的語言環境,
對於例如,土耳其語區域中的「TITLE」.toLowerCase()返回 「tıtle」,其中'ı'是拉丁小寫字母無我字符。若要 獲取區域設置不敏感字符串的正確結果,請使用 toLowerCase(Locale.ENGLISH)。
我指的是這些鏈接作爲解決問題的方法 ,它有指向牢記你的情況「土耳其」
**FROM THE LINKS**
toLowerCase()尊重國際化(i18n)。它將針對您的區域設置執行 大小寫轉換。當您致電 toLowerCase()時,內部toLowerCase(Locale.getDefault())正在調用 。它是語言環境敏感的,你不應該編寫一個圍繞獨立解釋語言環境的邏輯 。
import java.util.Locale;
public class ToLocaleTest {
public static void main(String[] args) throws Exception {
Locale.setDefault(new Locale("lt")); //setting Lithuanian as locale
String str = "\u00cc";
System.out.println("Before case conversion is "+str+
" and length is "+str.length());// Ì
String lowerCaseStr = str.toLowerCase();
System.out.println("Lower case is "+lowerCaseStr+
" and length is "+lowerCaseStr.length());// iı`
}
}
在上述程序中,看串長度之前和之後 轉換。它將是1和3.是 和大小寫轉換之前的字符串長度是不同的。當你在這種情況下依賴字符串長度時,你的邏輯將拋棄 。當您的程序 在不同的環境中執行時,它可能會失敗。這將是一個 良好的代碼審查。
爲了使它更安全,您可以使用另一種方法 toLowerCase(Locale.English),並始終將語言環境覆蓋爲英語。 但是你沒有國際化。
所以關鍵是,toLowerCase()是特定於語言環境的。
reference 1
reference 2
reference 3
無點-I,是小寫的 'i' 沒有點。這個角色的大寫字母是通常的「我」。還有一個角色,「我帶點」。這個字符的小寫字母是通常的小寫字母「i」。
你有沒有注意到這個問題?這種不對稱的轉換會導致編程中的嚴重問題。我們主要在Java應用程序中面臨這個問題,因爲(恕我直言)toLowerCase和toUpperCase函數的執行不力。
在Java中,String.toLowerCase()方法根據默認語言環境將字符轉換爲小寫字母。這會導致問題,如果您的應用程序在土耳其語區域設置工作,特別是如果您使用此功能的文件名或URL必須服從某個字符集。
我曾經在博客中介紹過兩個嚴肅的例子:如果XPage位於數據庫名稱爲「I」的數據庫中,那麼腳本庫的名稱中包含「i」的編譯錯誤和XSP Manager的錯誤。
如我所說,歷史悠久。例如,在某些R7版本中,如果他/她的名字以「I」開頭,則路由器無法向收件人發送消息。消息報告代理在R8之前未在土耳其語區域運行。任何擁有土耳其語區域設置的人都無法安裝Lotus Notes 8.5.1(這是真的!)。名單繼續...
幾乎沒有來自土耳其的測試者測試者,並且客戶不會爲這些問題開放PMR。所以這些問題不會成爲開發團隊的首要任務。
即使Java團隊又增加了一個特殊的警告,最新的文檔:
這種方法是語言環境敏感的,可能產生用於那些旨在獨立閱片區域 串意想不到的結果,如果 。示例是編程語言標識符,協議 鍵和HTML標籤。例如,土耳其語 語言環境中的「TITLE」.toLowerCase()將返回「tıtle」,其中'ı'是拉丁文小寫字母無符號 字符。要獲得區域設置不敏感字符串的正確結果,請使用toLowerCase(Locale.ENGLISH)。
請閱讀的鏈接,我不能此帖的所有IT的「THIS IS答覆您的意見」
您是否嘗試過不使用語言環境? – alaster
我試過了......它和Locale.ENGLISH很相似......但是我仍然懷疑它是否有任何區別,因爲它存在土耳其語...... 所以你說的不使用Locale會做... ??? –
你的應用程序會選擇默認的語言環境,所以如果有人用土耳其語的語言環境來運行你的應用程序,他會看到'i'沒有點 – alaster