Przede wszystkim chciałbym podkreślić, że ja absolutnie zgadzam się z (obecnie najwyżej oceniane) Odpowiedź z @codaddict.
Ale chciałem zrobić eksperyment, więc tutaj jest:
To nie jest formalny dowód, ale kod ten pobiegł za mną, nigdy nie osiągając wnętrze
if
(używając JDK 1.6.0 Aktualizacja 16 na Ubuntu):
Edit: Oto niektóre zaktualizowany kod, który obsługuje Locales także:
import java.util.Locale;
public class ToLowerTester {
public final Locale locale;
public ToLowerTester(final Locale locale) {
this.locale = locale;
}
public String findFirstStrangeTwoLetterCombination() {
char[] b = new char[2];
for (char c1 = 0; c1 < Character.MAX_VALUE; c1++) {
b[0] = c1;
for (char c2 = 0; c2 < Character.MAX_VALUE; c2++) {
b[1] = c2;
final String string = new String(b);
String lower = string.toLowerCase(locale);
if (string.length() != lower.length()) {
return string;
}
}
}
return null;
}
public static void main(final String[] args) {
Locale[] locales;
if (args.length != 0) {
locales = new Locale[args.length];
for (int i=0; i<args.length; i++) {
locales[i] = new Locale(args[i]);
}
} else {
locales = Locale.getAvailableLocales();
}
for (Locale locale : locales) {
System.out.println("Testing " + locale + "...");
String result = new ToLowerTester(locale).findFirstStrangeTwoLetterCombination();
if (result != null) {
String lower = result.toLowerCase(locale);
System.out.println("Found strange two letter combination for locale "
+ locale + ": <" + result + "> (" + result.length() + ") -> <"
+ lower + "> (" + lower.length() + ")");
}
}
}
}
Uruchomienie tego kodu z nazwiskami locale m w zaakceptowanej odpowiedzi podam kilka przykładów. Uruchomienie go bez argumentów spowoduje wypróbowanie wszystkich dostępnych ustawień narodowych (i zajmie sporo czasu!).
Nie jest obszerna, ponieważ teoretycznie mogą istnieć łańcuchy znaków, które zachowują się inaczej, ale to dobre pierwsze przybliżenie.
Należy również pamiętać, że wiele kombinacji dwuznakowych wytworzonych w ten sposób prawdopodobnie nieprawidłowy UTF-16, więc fakt, że eksploduje nic w tym kodzie można obwiniać tylko na bardzo solidnej API String w Javie.
I na koniec: nawet jeśli założenie jest prawdziwe dla aktualnej implementacji Javy, może łatwo zmienić się, gdy przyszłe wersje Javy będą implementować przyszłe wersje standardu Unicode, w których zasady nowych znaków mogą wprowadzać sytuacje gdzie to już nie jest prawdą.
Tak więc w zależności od tego wciąż jest to zły pomysł.
Czy możesz wymienić kilka przykładów? Znam kilka przykładów, które spowodowałyby, że wariant z dużymi literami różniłby się od wielkości małych liter, np. 'ß' stanie się' SS', ale nie na odwrót. – BalusC
+1: javadocs - tak blisko, a jednak daleko ... – MicSim
@BalusC: Istnieje kilka fantazyjnych reguł dotyczących łączenia znaków w locjach AZ, LT i TR, patrz 'java/lang/ConditionalSpecialCasing.java'. Na przykład '\ u00cc" .toLowerCase (nowe ustawienie regionalne ("lt")). Length() == 3' – axtavt