java - https docs djangoproject com en 2.1 topics i18n
IglesIgnoreCase de Java falla con ß("Sharp S" utilizado en el alfabeto alemán) (4)
mi primera pregunta aquí :-)
Hice todo lo posible para leer las reglas y buscar si la pregunta ya estaba hecha antes.
El siguiente código
String[] strings = {"cAsE", "/u00df"};
for (String str : strings) {
System.out.println(str.equalsIgnoreCase(str.toLowerCase()));
System.out.println(str.equalsIgnoreCase(str.toUpperCase()));
}
salidas verdaderas 3 veces (cAsE = case; cAsE = CASE; ß = ß) pero también 1 falso (ß! = SS). Intenté usar toLowerCase (Locale) pero no me ayudó.
¿Es esto un problema conocido?
Unicode no definió una versión en mayúscula de s-sharp, este es el punto exacto; en el idioma alemán no hay posibilidad de que una sharp-s (ß) sea una mayúscula o la letra inicial de una palabra. por lo tanto, no tiene sentido discutir sobre una capital ß ...
Hasta hace poco, Unicode no definía una versión en mayúsculas de s-sharp. No estoy seguro de si la última versión de Java 7 ya incluye este nuevo personaje y si lo maneja correctamente. Sugiero probarlo.
La razón por la cual str.toLowerCase()
no devuelve lo mismo que str.toUpperCase().toLowerCase()
es que Java reemplaza a ß
con SS
pero no hay forma de volver atrás, por lo que SS
convierte en ss
y la comparación falla.
Entonces, si necesita nivelar el caso, debe usar str.toLowerCase()
. De lo contrario, simplemente llamar a equalsIgnoreCase()
sin conversión superior / inferior debería funcionar también.
Hm. No sé nada sobre el idioma alemán, pero no estoy seguro de cómo me siento acerca de que los caracteres Unicode sean tratados como equivalentes a una expansión de letras romanas. ¿Deberías poder hacer lo siguiente?
myDictionary.put("glasses", new Bifocals());
myDictionary.get("glaßes");
Si tienes tus druthers, myDictionary.get("glaßes")
debería devolver algo de Bifocals
de antes. ¿Eso es legítimo?
Aaron Digulla lo tiene . Además, no tiene sentido transformar la cadena en ausencia de datos de localización. En inglés, la mayúscula de i es I , pero en turco es İ . String.compareIgnoreCase no tiene en cuenta los datos de la configuración regional.
(Como comentario adicional , es posible que desee considerar la normalización o terminará preguntándose por qué "é" .equals ("é") puede devolver falso. Motivo: una es una secuencia combinada ).