2011-08-24 19 views
18

A lo largo de la gran cantidad de caracteres Unicode, hay algunos que realmente representan más de un carácter, como la ligadura U + FB00 ff para dos caracteres 'f'. ¿Hay alguna manera fácil de convertir caracteres como estos en múltiples caracteres individuales? Preferiblemente, hay algo disponible en la API estándar de Java, pero puedo hacer referencia a una biblioteca externa si es necesario.Separación de caracteres de ligadura Unicode

+1

Me tomé la libertad de agregar la palabra clave * ligature * a su pregunta. :) – deceze

+0

Gracias - No estaba seguro de cómo se llamaban. :-) – nonoitall

+1

no grafema para la unidad fundamental? –

Respuesta

19

U + FB00 es un personaje de compatibilidad. Normalmente, Unicode no admite puntos de código separados para ligaduras (argumentando que es una decisión de diseño si y cuándo se debe usar una ligadura y no debe influir en cómo se almacenan los datos). A pocos de los que todavía existen para permitir la compatibilidad de conversión de ida y vuelta con codificaciones anteriores que hacen representan ligaduras como entidades separadas.

Afortunadamente, la información que representa la ligadura es presente en el Unicode data file y los sistemas de manejo de cadenas más capaces tienen esos datos incorporados.

En Java, se tendrá que utilizar the Normalizer class y la NFKC formulario:

String ff ="\uFB00"; 
String normalized = Normalizer.normalize(ff, Form.NFKC); 
System.out.println(ff + " = " + normalized); 

Esto imprimirá

ff = ff
+0

¡Impresionante! ¡Gracias! – nonoitall

+4

@nonoitall: NFKD no es una panacea: hay muchas ligaduras y otras formas combinadas teóricamente ** simplemente no funciona en absoluto. ** Por ejemplo, no logrará descomponer * ß * o * ẞ * en * SS * (incluso aquéllos hay un pliegue doble hacia abajo!), Ni * Æ * a * AE * o * æ * a * ae *, ni * Œ * a * OE * o * œ * a * oe *. Tampoco es útil para convertir * ð * o * đ * en * d * o * ø * en * o *. Para ** todas ** esas cosas, necesita el UCA (Algoritmo de intercalación Unicode), ** no ** NFKD. NFD/NFKD también tienen la propiedad molesta de destruir singletons, si esto te importa. – tchrist

+5

@tchrist: según tengo entendido, esas descomposiciones que menciona * no * deben hacerse. ¡No son simplemente ligaduras en el sentido tipográfico, sino personajes separados reales que se utilizan de manera diferente! ß * puede * descomponerse en ss si es necesario (por ejemplo, si solo puede almacenar ASCII), pero son ** no ** equivalentes. La ligadura ff, por otro lado, es * solo * una ligadura tipográfica. –

1

Puede probar el java.text.Normalizer, pero no estoy seguro si eso funciona para ligaduras.

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la opinión] (/ reseña/mensajes de baja calidad/18866472) – pirho

4

El proceso que está hablando se llama normalización y se especifica en el Unicode Normalization Forms nota técnica.

Hay una clase en la biblioteca de clases Java SE llamada java.text.Normalizer que implementa este proceso. Sin embargo, debe leer el documento Unicode vinculado anteriormente para descubrir cuál de los "formularios de normalización" debe usar para obtener el resultado que desea. No es sencillo ...

Cuestiones relacionadas