2012-06-16 10 views
48

Chciałem, aby kod konwertował wszystkie znaki w łańcuchach na wielkie lub małe litery w Javie.Używanie ustawień regionalnych z Java toLowerCase() i toUpperCase()

znalazłem metodę, która wygląda mniej więcej tak:

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

Teraz czytałem, że za pomocą pewnych Locale S, taką jak turecki, „zwraca I (bez kropki) zamiast i (z kropką). "

Czy można bezpiecznie używać takich urządzeń jak UK, US, ANGIELSKI itp.? Czy są jakieś duże różnice między nimi w przypadku zastosowania do łańcuchów?

Który z nich jest najbardziej preferowany Locale dla String s?

+1

Czy próbowałeś w ogóle nie korzystać z ustawień regionalnych? – alaster

+1

próbowałem go ... jest podobny do Locale.ENGLISH ...... ale nadal wątpię, czy ma jakieś różnice, ponieważ istnieje dla turecki ... tak mówiąc przy użyciu nie Locales zrobiłaby ... . ??? –

+4

Twoja aplikacja wybierze domyślne ustawienia regionalne, więc jeśli ktoś uruchomi Twoją aplikację w języku tureckim z tureckim ustawieniem, zobaczy "i" bez kropki – alaster

Odpowiedz

49

myślę, że należy użyć ustawienia regionalne,

Dla instancja "TITLE" .toLowerCase() w tureckim locale zwraca "tıtle", gdzie "ı" jest LATIN MAŁY LITER DOTLESS I character. Aby uzyskać uzyskać poprawne wyniki dla ciągów niewrażliwych na ustawienia regionalne, użyj doLowerCase (Locale.ENGLISH).

odnoszę się do tych linków jak rozwiązanie problemu i ma wskazywać pamiętać w sobie sytuację "turecki"

**FROM THE LINKS** 

toLowerCase() szanuje Internacjonalizacja (i18n). Wykonuje on konwersję przypadku na w odniesieniu do ustawień regionalnych. Po wywołaniu doLowerCase() wewnętrznie doLowerCase (Locale.getDefault()) jest wywoływana . Jest on wrażliwy na ustawienia narodowe i nie powinieneś pisać logiki wokół , interpretując ustawienia narodowe niezależnie.

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ı` 
    } 
} 

W powyższym programie, spojrzeć na długości łańcucha przed i po nawrócenia. Będzie to 1 i 3. Tak, długość łańcucha przed i po konwersji przypadku jest inna. Twoja logika pójdzie na rzucanie , gdy będziesz zależny od długości łańcucha w tym scenariuszu. Gdy Twój program zostanie wykonany w innym środowisku, może się nie udać. To będzie dobry połów w recenzji kodu.

Aby było to bezpieczniejsze, możesz użyć innej metody: do LOWERCase (Locale.English) i zastąpić zawsze ustawienia narodowe na język angielski. Ale wtedy nie jesteś umiędzynarodowiony.

Tak więc sedno to, toLowerCase() jest specyficzne dla ustawień narodowych.

reference 1
reference 2
reference 3


bez kropki-I jest małą literą 'i' bez kropki. Wielkie litery tej postaci to zwykłe "ja". Jest jeszcze jedna postać "Ja z kropką". Mała litera tego znaku to zwykła mała litera "i".

Czy zauważyłeś problem? Ta niesymetryczna konwersja powoduje poważny problem w programowaniu. Problem ten występuje głównie w aplikacjach Java z powodu (IMHO) słabej implementacji funkcji toLowerCase i toUpperCase.

W języku Java metoda String.toLowerCase() konwertuje znaki na małe litery zgodnie z domyślnymi ustawieniami regionalnymi. Powoduje to problemy, jeśli aplikacja działa w języku tureckim, a zwłaszcza jeśli używasz tej funkcji dla nazwy pliku lub adresu URL, który musi być zgodny z określonym zestawem znaków.

Mam na swoim blogu o dwóch poważnych przykładach: Błędy kompilacji z bibliotekami skryptów z "i" w ich nazwach i błędem menedżera XSP, jeśli XPage jest w bazie danych z "I" w nazwie.

Jest długa historia, jak już powiedziałem. Na przykład w niektórych wersjach R7 router nie mógł wysłać wiadomości do odbiorcy, jeśli jego imię zaczyna się od "I". Agenci raportowania komunikatów nie działali w tureckich wersjach językowych do wersji R8. Każdy, kto ma tureckie locale, nie może zainstalować programu Lotus Notes 8.5.1 (to prawda!). Lista jest długa ...

Niemal nie ma beta testera z Turcji, a klienci nie otwierają PMR dla tych problemów. Dlatego te problemy nie są priorytetem dla zespołów programistycznych.

zespół Nawet Java dodała specjalne ostrzeżenie do najnowszej dokumentacji:

Ta metoda jest locale wrażliwy i może powodować nieoczekiwane wyniki, jeśli wykorzystywane do łańcuchów, które mają być interpretowane locale niezależnie. Przykładami są identyfikatory języka programowania, klucze protokołu i znaczniki HTML. Na przykład "TITLE" .toLowerCase() w języku tureckim locale zwraca "tıtle", gdzie "ı" jest znakiem LATIN SMALL LETTER DOTLESS I . Aby uzyskać poprawne wyniki dla ciągów niewrażliwych na ustawienia regionalne, użyj opcji LOLERCase (Locale.ENGLISH).

PROSZĘ PRZECZYTAĆ LINKI CANT pisać to wszystko „TO JEST Odpowiedź na komentarz”

+1

, mówiąc, że określiłem Locale jako ENGLISH lub po prostu str.toLowerCase(). To by zrobiło ...... i nie muszę się martwić o długość ciągu ... ??? –

+3

PROSZĘ ZAPOZNAĆ SIĘ Z LINKAMI, CZY POST WSZYSTKIM JEST "TO ODPOWIADA NA TWOJĄ KOMENTARZ" – shareef

+1

k ... dobrze ... mam to ... dziękuję .. –

5
String str = "CyBeRdRaGoN"; 

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

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

Aplikacja będzie wybrać domyślne ustawienia regionalne, więc jeśli ktoś będzie uruchomić aplikację w turecki z tureckiego lokum ujrzy i bez kropki

2

Można stworzyć odpowiednie ustawienia narodowe dla języka swoich String „s.

Na przykład:

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

rade dla tureckiej.

0

Jeśli używasz tej funkcji do sprawdzania ciągu znaków (np. Wyszukiwania) Bezpiecznie jest używać ciągów w małej lub dużej formie do sprawdzenia.Możesz go używać tak:

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... 
} 

Konfrontuję ten sam problem, ale w przypadku wyszukiwania w widoku listy. Dodałem tę odpowiedź, że może pomóc komuś, kto ma ten sam problem.

Powiązane problemy