java - ernesto - tipo de dato string c++
¿Cómo normalizar correctamente una cadena con caracteres compuestos? (1)
Java Normalize ya me permite tomar caracteres acentuados y dar salida a caracteres no acentuados. Sin embargo, parece que no trata muy bien con los caracteres compuestos (Œ, Æ).
¿Hay alguna manera de que Java trate con estos personajes de forma nativa? Me gustaría evitar tener que mantener un mapa de estos caracteres (ya que esa fue la razón por la que cambiamos a utilizar Normalizar en primer lugar).
Por ejemplo, una entrada de "Œ" debería devolver "OE", de la misma manera que ya descompone perfectamente caracteres como "½" en "1/2".
TLDR; No, con java nativo no hay forma de manejarlos de manera uniforme.
Respuesta larga
Como se señaló en esta pregunta, Separando caracteres de ligadura de Unicode , la implementación de Java Normalizer no admite todas las ligaduras que existen en el lenguaje escrito.
La razón de esto es porque Unicode no admite todas las ligaduras que existen en el lenguaje escrito. Las ligaduras son un tema debatido cuando se trata del almacenamiento de lenguaje escrito porque se puede argumentar que no son importantes desde un punto de vista de datos y que son importantes desde un punto de vista de diseño.
El punto de vista de los datos afirma que no se pierde información, por lo que tiene más sentido utilizar solo las formas descompuestas y que las formas compuestas no deben estar en Unicode.
El punto de vista del diseño afirma que la ligadura compuesta representa el diseño adecuado de la forma escrita del lenguaje y, por lo tanto, debe representarse en los datos con un código especial.
Solución posible
Sugeriría crear un Service que tenga una interfaz que maneje ligaduras solamente. Suministre una implementación concreta que maneje todo lo que necesita actualmente. En el futuro, si se necesitan nuevas implementaciones, será sencillo agregarlas sin modificar el código original simplemente agregando un nuevo JAR a la ruta de clase del programa que agregue las ligaduras faltantes.
La implementación esquelética puede verse así.
Tenga en cuenta que he omitido el código que realmente utiliza el ServiceLoader
para ubicar las implementaciones de LigatureDecoder
y LigatureEncoder
.
final class Ligatures {
public static CharSequence compose ( CharSequence decomposedCharacters );
public static CharSequence decompose ( CharSequence composedCharacters );
}
interface LigatureDecoder {
CharSequence decompose ( CharSequence composedCharacters );
}
interface LigatureEncoder {
CharSequence compose ( CharSequence decomposedCharacters );
}