2011-09-09 10 views
27

He estado buscando en todo StackOverflow en el bazillion de preguntas sobre capitalizar una palabra en Java, y a ninguno de ellos parece importarle lo más mínimo la internacionalización y, de hecho, ninguna parece realmente para trabajar en un contexto internacional. Ésta es mi pregunta.Caso de título correcto en Unicode en Java

Tengo una cadena en Java, que representa una palabra - todos son caracteres de Cartas(), sin espacios en blanco. Quiero hacer el primer carácter mayúscula y el resto minúscula. Tengo la ubicación de mi palabra a mano.

Es bastante fácil llamar .substring (1) .toLowerCase (Locale) para la última parte de la cadena. No tengo ni idea de cómo obtener el primer personaje correcto, sin embargo.

El primer problema que tengo es en holandés, donde "ij" es un dígrafo que debe escribirse en mayúscula. Podría hacer un caso especial a mano, porque lo sé; ahora puede haber otros idiomas con este tipo de cosas que no conozco, y estoy seguro de que Unicode me dirá si lo pregunto bien. Pero no sé cómo preguntar.

Incluso si se resuelve el problema anterior, todavía estoy atascado con una forma incorrecta de manejar inglés, turco y griego, porque Character admite el título pero no la configuración regional, y String admite configuraciones regionales pero no el título.

Si tomo el punto de código y lo paso a Character.toTitleCase(), esto fallará porque no hay forma de pasar la configuración regional a este método. Entonces, si la configuración regional del sistema está en inglés pero la palabra es en turco, y la primera letra de la palabra es "i", obtendré "I" en lugar de "İ" y esto es incorrecto. Ahora, si tomo una subcadena y uso .toUpperCase (Locale), esto fallará porque es mayúscula y no por el título. Entonces, si la palabra es griega, seguiré recibiendo el personaje equivocado.

Si alguien tiene consejos útiles, me gustaría escucharlos.

+0

'toTitleCase()' no necesita una configuración regional, ya que es independiente de la configuración regional. --- Si desea que los dos caracteres 'ij' sean un dígrafo, debe convertirlo al carácter unicode dígrafo' ij' (['LATIN SMOR LIGATURE IJ' (U + 0133)] (http: // www. fileformat.info/info/unicode/char/0133/index.htm)). – Andreas

Respuesta

3

El problema es que la diferenciación de letras mayúsculas y minúsculas es muy específica de un idioma. Tantos, tal vez la mayoría de los idiomas, no los tienen.

De todos modos, hay toda una sección Unicode: http://www.unicode.org/faq/casemap_charprop.html

..y que supongo que hay una tabla de asignación específica de Unicode en alguna parte (algo así ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt). Entonces, probablemente sea mejor usar su propio método de conversión.

6

Al igual que usted, no he podido encontrar un método adecuado en la API central de Java.

Sin embargo, parece haber un locale-sensitive string-title-case method (UCharacter#toTitleCase) in the ICU library.


En cuanto a la fuente de los métodos UCI relevantes (UCharacter#toTitleCase y UCaseProps#toUpperOrTitle), allí no parece haber muchos casos especiales específicos de la localidad para el título-carcasa, por lo que podría ser capaz de salirse con la siguiente:

  1. Encuentra el primer carácter insertado en la cadena.
  2. Si tiene un formulario de título de propiedad distinto de su formulario en mayúscula, utilícelo.
  3. De lo contrario, realice una mayúscula sensible a la configuración regional en ese primer carácter y sus caracteres combinados.
  4. Realice una minúscula sensible a la configuración regional en el resto de la cadena.
  5. Si la configuración regional es holandesa y el primer carácter encapsulado es una "I" seguida de una "j", mayúscula la "j".
4

El único dígrafo de dos caracteres en el que ambos caracteres se escriben en mayúscula a la vez y que probablemente encontrará en un programa de la vida real es el holandés IJ. Solo tráelo si la configuración regional es holandesa. En el peor escenario improbable, habrá 1-2 casos que necesitará agregar más tarde, no es que encontrará un nuevo dígrafo de capitalización todos los días, por lo que no vale la pena centrarse en la generalización aquí.

Nota: en general, no es posible usar la conversión de carácter a carácter para obtener el título o mayúsculas para un idioma arbitrario. Algunos caracteres minúsculos se traducen en más de un carácter en mayúscula. Entonces debes usar String en un caso genérico.

Pero no hay ningún problema con la configuración regional del título. Probablemente hay un pequeño malentendido acerca de cómo funciona el métodoTitleCase(). Convertirá al caso de título cualquier carácter, incluido uno que ya está en mayúsculas.

Por ejemplo, considere el carácter dž. Es la forma en mayúsculas es DŽ y la forma caso de título es Dž:

System.out.println(Character.toUpperCase('\u01C4')); 
DŽ 

y

System.out.println(Character.toTitleCase('\u01C4')); 
Dž 

sin embargo, el siguiente también dará caso de título

System.out.println(Character.toTitleCase(Character.toUpperCase('\u01C4'))); 
Dž 

Así , si convierte con configuración regional a mayúsculas antes del título, obtiene el punto de código correcto y no hay probl em caso de usar el título del resultado, incluyendo Turquía, etc .:

System.out.println(Character.toTitleCase("dž".toUpperCase().charAt(0))); 
System.out.println(Character.toTitleCase("i".toUpperCase(Locale.forLanguageTag("tr")).charAt(0))); 
Dž 
İ 

nota, simplemente usando el caso del título de un solo caráctersi hay una diferencia de su caja superior no es correcto en un caso genérico .

En resumen:

  • manija dígrafo Holandés (u otros dígrafos si los encuentra, dudo mucho de que y en el peor Será 1-2 casos para toda la vida del programa).
  • Convierta los caracteres necesarios como String utilizando la configuración regional y toUpperCase()
  • Convierta todos los caracteres del resultado toUpperCase utilizando Character toTitleCase.

Nota, todavía hay algunos casos de mayúsculas que son contextuales, como prefijo irlandés, nombres de ff en inglés, etc. que requieren más que solo un procesamiento de caracteres/cadena, pero dudo que deba manejarlos para el título generación en un programa.

Cuestiones relacionadas