2009-08-26 4 views
14

mi primera pregunta aquí :-)
Hice todo lo posible para leer las reglas y buscar si la pregunta ya estaba hecha antes.Java's equalsIgnoreCase falla con ß ("Sharp S" usado en el alfabeto alemán)

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 verdaderos 3 veces (Caso = caso; Caso = CASE; ß = SS) sino también 1 falso (SS = SS!). Intenté usar toLowerCase (Locale) pero no sirvió de nada.

Es éste un problema conocido?

+1

Michael Kaplan ha escrito extensamente sobre el personaje alemán Sharp S. Las cosas han cambiado recientemente y espero que las bibliotecas jueguen al alza. Mucha información buena aquí: http://blogs.msdn.com/michkap/archive/2008/05/15/8506679.aspx –

Respuesta

10

Hasta hace poco, Unicode no definía una versión en mayúscula 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 str.toLowerCase() no devuelve el mismo que str.toUpperCase().toLowerCase() es que Java reemplaza ß con SS pero no hay forma de volver atrás, por lo que se convierte en SSss y comparar falla.

Si necesita nivelar la carcasa, debe usar str.toLowerCase(). De lo contrario, simplemente llame al equalsIgnoreCase() sin ninguna conversión superior/inferior debería funcionar también.

+1

Incluso si Java 7 admite el nuevo carácter Unicode, "ß" .toUpperCase() aún debe devolver "SS", ya que la "ß" mayúscula es solo de interés tipográfico y no se usa realmente en la naturaleza: http: //en.wikipedia.org/wiki/Capital_ß –

+0

En mi caso estoy tratando de unir las cadenas de algunos usuarios con las predefinidas (tal vez debería haberlo mencionado en la pregunta original ...) Así que el código que di aquí como ejemplo es solo una prueba que realicé para entender por qué mi código original no funcionó como se esperaba. Obviamente, existe el método equalsIgnoreCase para evitar que cambiemos el caso de cualquiera de las cadenas. De todos modos, el concepto de "nivelación" es lo que hace de esto mi respuesta aceptada :-) – targumon

0

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 usted tiene sus druthers, myDictionary.get("glaßes") debe devolver algo del Bifocals de antes. ¿Eso es legítimo?

+2

"ß" y "ss" no son equivalentes. "ss" a veces se usa para escribir "ß" cuando esa letra no está disponible. Como no hay mayúscula "ß" (vale, hay una, pero es principalmente una curiosidad tipográfica y no una letra que se usa en la realidad) siempre se escribirá como "SS" en MAYÚSCULAS. Lo opuesto no es verdad: "SS" .toLower() es definitivamente "ss". –

+0

Ah, tengo. Gracias por la aclaración, Joachim. –

2

Aaron Digulla has it. 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 & # x0130;. String.compareIgnoreCase no tiene en cuenta los datos de la configuración regional.

(Dicho sea de paso, es posible que desee ver en normalization, o que va a terminar preguntándose por qué "& # x00E9;" iguales ("& # x0065; & # x0301;".) puede devolver false . Motivo: uno es un combining sequence)

+0

es raro para mí que la clase String tiene 2 métodos para cada uno de toLowerCase y toUpperCase (uno sin parámetros + uno que acepta una configuración regional) pero sólo 1 Método de cada uno de equalsIgnoreCase y compareToIgnoreCase si los chicos de Sun piensan que el * los métodos de caso deben ser sensibles a la configuración regional, entonces espero que todos ellos también lo acepten. Gracias por el enlace de normalización, es un exceso para mi caso, pero perspicaz de todos modos. – targumon

+0

@targumon: Tenga en cuenta que en * all * locales '" ß ".toUpperCase (locale)' devuelve '" SS "', pero igual aIgnoreCase no le importa. Todo está roto de alguna manera. – maaartinus

2

Unicode no definió una versión en mayúsculas de s-aguda este es el punto exacto - en el idioma alemán no existe la posibilidad de una brusca-s (. ß) ser un capital o la letra inicial de cualquier palabra. por lo tanto, no tiene sentido discutir sobre una capital ß ...

Cuestiones relacionadas