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
Respuesta
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
¡Impresionante! ¡Gracias! – nonoitall
@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
@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. –
Puede probar el java.text.Normalizer, pero no estoy seguro si eso funciona para ligaduras.
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
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 ...
- 1. Caracteres Unicode de Base64ing
- 2. Lista de caracteres alfabéticos Unicode
- 3. Python: reemplace el espacio de no separación en Unicode
- 4. Python - Pyrersing caracteres Unicode
- 5. caracteres Unicode cadena
- 6. Python punto de código Unicode de caracteres Unicode
- 7. Detección de ligaduras de texto Unicode en Clojure/Java
- 8. ¿Qué caracteres Unicode representan "tiempo"?
- 9. Escribir caracteres Unicode en OStream
- 10. Dibujando caracteres Unicode en iPhone
- 11. C# Botón Texto Caracteres Unicode
- 12. Caracteres Unicode en cadena - iphone
- 13. iText, caracteres Unicode y Java
- 14. caracteres Unicode e Internet Explorer
- 15. Url caracteres Unicode que codifican
- 16. Conversión de caracteres chinos a Unicode
- 17. Comparación de caracteres Unicode del objetivo C
- 18. Literales de caracteres Unicode (hexadecimales) en MySQL
- 19. Detección de caracteres " " desconocida Unicode en PHP
- 20. ¿Cómo especifico un rango de caracteres Unicode?
- 21. Caracteres Unicode en un script de Ruby?
- 22. Wordpress está ignorando Unicode Caracteres de URL
- 23. Caracteres Unicode del código de caracteres en javascript para los códigos de caracteres> 0xFFFF
- 24. Cómo decidir la ligadura para "FI" en Java (y otros)
- 25. caracteres Unicode no se muestra en System.Windows.Forms.TextBox
- 26. Convertir o eliminar caracteres Unicode "ilegales"
- 27. ¿Qué caracteres NO están presentes en Unicode?
- 28. Mostrar caracteres Unicode en TextView Android
- 29. Unicode Regex; caracteres no válidos XML
- 30. Regex para nombres con caracteres especiales (Unicode)
Me tomé la libertad de agregar la palabra clave * ligature * a su pregunta. :) – deceze
Gracias - No estaba seguro de cómo se llamaban. :-) – nonoitall
no grafema para la unidad fundamental? –