2012-06-16 35 views
48

我希望代碼將字符串中的所有字符都轉換爲Java中的大寫或小寫。將語言環境與Java的toLowerCase()和toUpperCase()一起使用

我發現是這樣的方法:我讀過,使用某些Locale S,像土耳其,「返回我(不點)

public static String changelowertoupper() 
{ 
     String str = "CyBeRdRaGoN"; 
     str=str.toLowerCase(Locale.ENGLISH); 
     return str; 
} 

現在,而不是我(帶點)。「

使用Locale就像英國,美國,英國等一樣安全嗎?當它們應用於字符串時,它們之間是否有很大差異?

哪一個是最優選的LocaleString s?

+1

您是否嘗試過不使用語言環境? – alaster

+1

我試過了......它和Locale.ENGLISH很相似......但是我仍然懷疑它是否有任何區別,因爲它存在土耳其語...... 所以你說的不使用Locale會做... ??? –

+4

你的應用程序會選擇默認的語言環境,所以如果有人用土耳其語的語言環境來運行你的應用程序,他會看到'i'沒有點 – alaster

回答

49

我認爲你應該使用的語言環境,

對於例如,土耳其語區域中的「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答覆您的意見」

+1

所以你說如果我指定區域設置爲英語或簡單地str.toLowerCase()。它會......並且我不必擔心字符串長度.... –

+3

請閱讀鏈接,我可以發佈所有的「這是你的意見回覆」 – shareef

+1

k ...罰款...我知道了..謝謝.. –

5
String str = "CyBeRdRaGoN"; 

str = str.toLowerCase(); // str = "cyberdragon" 

str = str.toUpperCase(); // str = "CYBERDRAGON" 

您的應用程序會選擇默認的語言環境,因此,如果有人將運行在土耳其與土耳其語言環境的應用程序,他會看到i沒有點

2

您可以爲您的String的語言相應的語言環境。

例如:

toUpperCase(new Locale("tr","TR")); 

會做的伎倆土耳其。

0

如果您使用此函數檢查字符串(例如搜索)使用小寫或大寫形式的字符串進行檢查是安全的。你可以這樣使用它:

if (mViewData.list.data[i].Name.toLowerCase(new Locale("tr", "TR")) 
    .contains(mViewHolder.tctSearch.getText().toString().trim() 
             .toLowerCase(new Locale("tr", "TR")))) { 
    // your code here... 
} 

我面對同樣的問題,但在列表視圖的情況下搜索。我添加了這個答案,它可以幫助有同樣問題的人。

相關問題