El problema es que, como saben, hay miles de caracteres en el gráfico Unicode y quiero convertir todos los caracteres similares a las letras que están en alfabeto inglés.
Por ejemplo, aquí hay algunas conversiones:
ҥ->H
Ѷ->V
Ȳ->Y
Ǭ->O
Ƈ->C
tђє Ŧค๓เℓy --> the Family
...
y vi que hay más de 20 versiones de la letra A / a. y no sé cómo clasificarlos. Parecen agujas en el pajar.
La lista completa de caracteres unicode se encuentra en http://www.ssec.wisc.edu/~tomw/java/unicode.html o http://unicode.org/charts/charindex.html . Solo intenta desplazarte hacia abajo y ver las variaciones de las letras.
¿Cómo puedo convertir todo esto con Java? Por favor, ayúdame :(
java
unicode
special-characters
diacritics
AhmetB - Google
fuente
fuente
Respuestas:
Volver a publicar mi publicación de ¿Cómo elimino los signos diacríticos (acentos) de una cadena en .NET?
Este método funciona bien en Java (con el único fin de eliminar los signos diacríticos, también conocidos como acentos) .
Básicamente, convierte todos los caracteres acentuados en sus contrapartes desacentuados, seguidos de su combinación de signos diacríticos. Ahora puede usar una expresión regular para quitar los signos diacríticos.
fuente
Es una parte de Apache Commons Lang a partir de la versión. 3.0.
devoluciones
An
Ver también http://www.drillio.com/en/software-development/java/removing-accents-diacritics-in-any-language/
fuente
Intentar "convertirlos a todos" es el enfoque equivocado del problema.
En primer lugar, debe comprender las limitaciones de lo que está tratando de hacer. Como otros han señalado, los signos diacríticos están ahí por una razón: son letras esencialmente únicas en el alfabeto de ese idioma con su propio significado / sonido, etc .: eliminar esas marcas es lo mismo que reemplazar letras al azar en una palabra en inglés. Esto es incluso antes de considerar los idiomas cirílicos y otros textos basados en guiones como el árabe, que simplemente no se pueden "convertir" al inglés.
Si debes , por cualquier razón, convertir caracteres, entonces la única forma sensata de abordarlo es reducir primero el alcance de la tarea en cuestión. Considere la fuente de la entrada: si está codificando una aplicación para "el mundo occidental" (para usar una frase tan buena como cualquiera), sería poco probable que alguna vez necesite analizar los caracteres árabes. Del mismo modo, el conjunto de caracteres Unicode contiene cientos de símbolos matemáticos y gráficos: no hay una forma (fácil) para que los usuarios ingresen directamente estos, por lo que puede suponer que pueden ignorarse.
Al seguir estos pasos lógicos, puede reducir la cantidad de caracteres posibles para analizar hasta el punto en que sea factible una operación de búsqueda / reemplazo basada en el diccionario. Luego se convierte en una pequeña cantidad de trabajo un poco aburrido crear los diccionarios, y una tarea trivial para realizar el reemplazo. Si su idioma admite caracteres Unicode nativos (como lo hace Java) y optimiza las estructuras estáticas correctamente, tales hallazgos y reemplazos tienden a ser cegadoramente rápidos.
Esto proviene de la experiencia de haber trabajado en una aplicación que se requería para permitir a los usuarios finales buscar datos bibliográficos que incluían caracteres diacríticos. Las matrices de búsqueda (como en nuestro caso) tardaron quizás 1 día hombre en producirse, para cubrir todas las marcas diacríticas para todos los idiomas de Europa occidental.
fuente
Dado que la codificación que convierte "la Familia" en "tђє Ŧ ค ๓ เ ℓy" es efectivamente aleatoria y no sigue ningún algoritmo que pueda explicarse por la información de los puntos de código Unicode involucrados, no hay una forma general de resolver esto algorítmicamente.
Deberá construir la asignación de caracteres Unicode en caracteres latinos a los que se parecen. Probablemente podría hacer esto con algo de aprendizaje automático inteligente sobre los glifos reales que representan los puntos de código Unicode. Pero creo que el esfuerzo para esto sería mayor que construir manualmente ese mapeo. Especialmente si tiene una buena cantidad de ejemplos a partir de los cuales puede construir su mapeo.
Para aclarar: algunas de las sustituciones pueden resolverse realmente a través de los datos Unicode (como lo demuestran las otras respuestas), pero algunas letras simplemente no tienen una asociación razonable con los caracteres latinos a los que se parecen.
Ejemplos:
fuente
La solicitud original ya ha sido respondida.
Sin embargo, estoy publicando la respuesta a continuación para aquellos que podrían estar buscando un código genérico de transliteración para transliterar cualquier juego de caracteres al latín / inglés en Java.
Significado ingenuo de la transliteración: la cadena traducida en su forma final / juego de caracteres objetivo suena como la cadena en su forma original. Si queremos transcribir cualquier juego de caracteres al latín (alfabetos en inglés), entonces ICU4 (biblioteca ICU4J en Java) hará el trabajo.
Aquí está el fragmento de código en Java:
fuente
Cadena probada: ÁÂÄÄÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝß
Probado:
La última opción es la mejor.
fuente
Si la necesidad es convertir "òéışöç-> oeisoc", puede usar este un punto de partida:
JDK 1.6 proporciona la clase java.text.Normalizer que se puede usar para esta tarea.
Mira un ejemplo aquí
fuente
Puede intentar usar
unidecode
, que está disponible como una gema de rubí y como un módulo perl en cpan . Esencialmente, funciona como una gran tabla de búsqueda, donde cada punto de código Unicode se relaciona con un carácter o cadena ascii.fuente
No hay una manera fácil o general de hacer lo que quieres porque es solo tu opinión subjetiva de que estas letras se parecen a las letras latinas a las que deseas convertir. En realidad, son letras separadas con sus propios nombres y sonidos distintos que simplemente parecen superficialmente una letra latina.
Si desea esa conversión, debe crear su propia tabla de traducción basada en las letras latinas a las que cree que deberían convertirse las letras no latinas.
(Si solo desea eliminar las marcas diacríticas, hay algunas respuestas en este hilo: ¿Cómo elimino los signos diacríticos (acentos) de una cadena en .NET? Sin embargo, describe un problema más general)
fuente
Llego tarde a la fiesta, pero después de enfrentar este problema hoy, encontré que esta respuesta es muy buena:
Referencia: https://stackoverflow.com/a/16283863
fuente
El problema con la "conversión" de Unicode arbitrario a ASCII es que el significado de un personaje depende de la cultura. Por ejemplo, "ß" para una persona de habla alemana debería convertirse a "ss", mientras que un angloparlante probablemente lo convertiría a "B".
Agregue a eso el hecho de que Unicode tiene múltiples puntos de código para los mismos glifos.
El resultado es que la única forma de hacerlo es crear una tabla masiva con cada carácter Unicode y el carácter ASCII al que desea convertirlo. Puede tomar un atajo normalizando caracteres con acentos para normalizar desde KD, pero no todos los caracteres se normalizan a ASCII. Además, Unicode no define qué partes de un glifo son "acentos".
Aquí hay un pequeño extracto de una aplicación que hace esto:
fuente
La siguiente clase hace el truco:
fuente