topics i18n docs djangoproject java localization internationalization locale

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