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”
Czy próbowałeś w ogóle nie korzystać z ustawień regionalnych? – alaster
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 ... . ??? –
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