Tengo un archivo en UTF-8 que contiene textos en varios idiomas. Muchos de ellos son nombres de personas. Necesito convertirlo a ASCII y necesito que el resultado se vea lo más decente posible.
Hay muchas formas de abordar la conversión de una codificación más amplia a una más estrecha. La transformación más simple sería reemplazar todos los caracteres que no son ASCII con algún marcador de posición, como '_'. Si conozco el idioma en el que está escrito el archivo, hay posibilidades adicionales, como la romanización.
¿Qué herramienta de Unix o biblioteca de lenguaje de programación disponible en Unix me puede dar una conversión decente (el mejor esfuerzo) de UTF-8 a ASCII?
La mayor parte del texto está en idiomas europeos basados en el tipo latino.
fuente
iconv
ytr
, hay Unidecode . No estoy familiarizado con él, pero podría hacer lo que quiera, si puede usar Python.Respuestas:
Hará la conversión de mejor esfuerzo, dependiendo de las tablas de conversión. Si conoce aproximadamente el idioma de entrada, hay filtros específicos de idioma que ofrecen mejores resultados, por ejemplo
es la conversión del esperanto en la representación x-metodo,
intentará hacer una representación TeX de diacríticos, hay parámetros específicos del idioma:
transliterará "ä" en "ae" (habitual para el alemán) en lugar de "a"
utilizará las reglas polacas para transcribir el ruso, en lugar de las "inglesas", etc.
fuente
konwert
sitio web? ¿Está empaquetado en alguna parte? github.com/taw/konwert/tree/master/konwert-1.8Esto funcionará para algunas cosas:
echo ĥéĺłœ π | iconv -f utf-8 -t ascii//TRANSLIT
vuelvehelloe ?
. Cualquier carácter queiconv
no sepa cómo convertir será reemplazado por signos de interrogación.iconv
es POSIX, pero no sé si todos los sistemas tienen laTRANSLIT
opción. A mí me funciona en Linux. Además, laIGNORE
opción descartará silenciosamente los caracteres que no se pueden representar en el conjunto de caracteres de destino (verman iconv_open
).Una opción inferior pero compatible con POSIX es usar
tr
. Este comando reemplaza todos los puntos de código que no son ASCII con un signo de interrogación. Lee el texto UTF-8 un byte a la vez. "É" podría reemplazarse conE?
o?
, dependiendo de si se codificó utilizando un acento combinado o un carácter precompuesto.Ese ejemplo regresa
caf? ?????
, usando caracteres precompuestos.fuente
tr
no está destinado a trabajar un byte a la vez. GNU tr lo hace, pero es un error.iconv -f utf-8 -t ascii//TRANSLIT
funcionó bien para mí Cambió las comillas rizadas por comillas rectas. Gracias.//TRANSLIT
también funciona para otros conjuntos de caracteres, por ejemploiso-8859-1//TRANSLIT
.iconv
daiconv: illegal input sequence at position 1234
y trunca el archivo por mí. Sería bueno si simplemente eliminara el personaje e intentara retomar la secuencia nuevamente.tratar
uni2ascii -B input.txt >output.txt
uni2ascii
fuente
¿Quiere decir que desea poder convertir los siguientes nombres en una cadena ASCII a la que la persona interesada no se opondría?
Sospecho que no hay una herramienta automatizada que pueda hacer esto. No puede haber ninguna o muchas latinizaciones de nombres personales. El software no puede elegir la versión culturalmente aceptable. Al menos no sin que el software sepa mucho sobre la cultura de la persona involucrada.
Ver también /programming//a/1398403/477035
fuente
perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")'
produce `` bd llh lthny bn lHsyn` que es una transcripción lo suficientemente buena para mis propósitos.Terminé usando Perl con Text :: Unidecode para esto. Ejemplo:
produce
bd llh lthny bn lHsyn
, que es un resultado aceptable para mis propósitos.fuente