2012-02-03 14 views
5

Estoy tratando siguiente códigoconvertir ß.cfg a mayúsculas usando toUpperCase() en Java

String s1 = new String ("ß.cfg"); 
System.out.println (s.toUpperCase()); 

de salida que estoy recibiendo es SS.CFG desde Unicode no definió una versión en mayúsculas de ß mientras yo quiero la salida como ß.CFG.

¿Hay alguna manera de lograr que los Gracias de antemano

Respuesta

5

La documentación para toUpperCase(Locale) afirma explícitamente que esto es lo que sucederá:

Sin Las asignaciones de mayúsculas/minúsculas no siempre son mapeos de carbonilla 1: 1, la Cadena resultante puede tener una longitud diferente a la Cadena original.

pequeña letra s afilados -> dos letras: SS

+0

sí, esto es lo que ocurre incluso después de pasar a la configuración regional. –

+0

Sí ... se dice en los documentos que lo hace por _todas_ lugares –

+0

¿hay alguna manera puedo lograr lo que estoy tratando de hacer? –

6

El carácter "ß" es equivalente a "ss" (utilizado en alemán, por ejemplo), y esto se define así en su configuración regional (la configuración regional que está utilizando en su aplicación).

Usted puede tratar de hacer algún experimento con una configuración regional diferente utilizando el método:

toUpperCase(Locale locale) 

Edit: Como dijo el usuario, este método no es válida, una posible workaroud (no muy elegante) es:

String s1 = new String ("auß.cfg").replace('ß', '\u9999'); 
    System.out.println (s1.toUpperCase(Locale.UK).replace('\u9999', 'ß')); 
+0

incluso pasan resultados de localización son los mismos sin cambio en la producción en absoluto –

+0

Tiene usted razón, los primeros 255 caracteres de unicode se traducen con latin1 (carácter de clase): si (punto de código <= FAST_PATH_MAX) {// FAST_PATH_MAX = 255 mayúsculas = CharacterDataLatin1.toUpperCaseEx (punto de código); } else { ... – greuze

0

Parece que Characeter.toUpperCase() ignora estas reglas, de modo que se puede usar para implementar la conversión deseada:

casos Cadena métodos de mapeo tener varios beneficios sobre los métodos de mapeo de casos de Caracteres. Los métodos de asignación de mayúsculas y minúsculas pueden realizar asignaciones sensibles a la configuración regional, asignaciones sensibles al contexto y mapeos de caracteres 1: M, mientras que los métodos de mapeo de Caracteres de caracteres no.

3

La implementación de Java simplemente sigue lo que dice la especificación Unicode. Y dice Unicode esto:

# ================================================================================ 
# Unconditional mappings 
# ================================================================================ 

# The German es-zed is special--the normal mapping is to SS. 
# Note: the titlecase should never occur in practice. It is equal to titlecase(uppercase(<es-zed>)) 

00DF; 00DF; 0053 0073; 0053 0053; # LATIN SMALL LETTER SHARP S 

Referencia: http://unicode.org/Public/UNIDATA/SpecialCasing.txt

Si desea implementar una forma de conversión de mayúsculas que es diferente a Unicode, tendrá que especificar y aplicar por sí mismo.


(Si desea ver un montón de gente que se caliente bajo el cuello de "mayúscula ß", lea este hilo de correo electrónico - http://unicode.org/mail-arch/unicode-ml/y2007-m05/0007.html)

-1

El PO no indicó lo que en el mundo real problema que estaba tratando de resolver. Puede haber otro enfoque que resuelva el problema con éxito.

Me encontré con un problema similar cuando estaba tratando de encontrar coincidencias de una manera independiente del caso.Usé toUpperCase() para intentar normalizar las cadenas antes de la comparación usando String.indexOf(), y encontré problemas con este caracter.

No encontré configuraciones regionales en las que toUpperCase() del carácter ß resultaron en algo más que SS (aunque admití que no probé todas las configuraciones regionales posibles).

Mi solución fue usar String.toLowerCase() para el juego. En mi conjunto de datos, no hubo incidentes donde hacer eso cambiaría la cantidad de caracteres.

Editar para agregar - Un ejemplo de código (según lo solicitado):

String[] matches = "SS,ss,ß".split(","); 
System.out.printf("%12s %5s %5s %5s\n", " ", matches[0], matches[1], matches[2]); 
String g = "Großenhain"; 
for (String g1 : new String[]{g, g.toUpperCase(), g.toLowerCase(), g.toUpperCase().toLowerCase()}) 
{ 
    System.out.printf("%12s", g1); 
    for (String match : matches) 
     System.out.printf(" %5d", g1.indexOf(match)); 
    System.out.println(); 
} 

(I tiró la toUpperCase() toLowerCase() sólo por diversión, no como una posible solución..)

salida:

   SS ss  ß 
    Großenhain -1 -1  3 
GROSSENHAIN  3 -1 -1 
    großenhain -1 -1  3 
grossenhain -1  3 -1 
Cuestiones relacionadas