2009-04-30 6 views
5

estoy en Mac Os X 10.5 (pero reproduje el tema en 10.4)Cómo arreglar un problema extraño con iconv en Mac OS X

Estoy tratando de utilizar iconv para convertir un UTF-archivo de 8 a ASCII

el archivo UTF-8 contiene personajes como 'EAC'

quiero que los caracteres acentuados se conviertan en su ASCII equivalente más cercano

por lo

mi mando es la siguiente:

iconv -f UTF-8 -t ASCII // // TRANSLIT IGNORE myutf8file.txt

que funciona muy bien en una máquina Linux

pero en mi Mac OS locales XI conseguir este por ejemplo:

e => 'e

a => `un

Realmente no undersatnd qué iconv devuelve esta salida raro en Mac OS X, pero todo está bien en Linux

ayuda? o instrucciones?

gracias de antemano

+0

¿Cuál es el resultado que obtiene en Linux? – kch

+0

y ¿qué te parece extraño sobre la salida mac? ¿está usando el ícono suministrado por Apple o lo instaló a través de macports, lo compiló usted mismo, cualquier otra cosa? – kch

+0

hi en Linux: E => E, A => a –

Respuesta

0

mi suposición es que en su máquina Linux la configuración regional se establece de manera diferente ... por lo que yo puedo recordar, iconv utiliza la localización actual de traducir UTF-X, y por defecto la macos tiene la configuración regional establecida en "C", que (obviamente) no controla los acentos y caracteres específicos del idioma ... tal vez trate de hacer esto antes de correr iconv:

setLocale(LC_ALL, "en_EN"); 

| K <

+0

hi gracias pero esto no parece ser el problema como he cambiado la configuración regional pero no ha cambiado nada. O no sé cómo cambiar la configuración regional en realidad estoy haciendo esto en mi .bash_profile exportación LC_ALL = fr_FR.UTF-8 y la configuración regional corriendo devuelve: lang = LC_COLLATE = "fr_FR.UTF- 8 "LC_CTYPE =" fr_FR.UTF-8 "LC_MESSAGES =" fr_FR.UTF-8 "LC_MONETARY =" fr_FR.UTF-8 "LC_NUMERIC =" fr_FR.UTF-8 "LC_TIME =" fr_FR.UTF-8 "LC_ALL =" fr_FR.UTF-8 " Espero que esto ayude a encontrar una respuesta –

8

el problema es que Mac OS X usa otra implementación de iconv llamada libiconv. La mayoría de las distribuciones de Linux tienen una implementación de iconv que es parte de libc. Lamentablemente, libiconv transcribe caracteres como ö, è y ñ como "o,` e y ~ n. La única manera de solucionar esto es descargar el código fuente y modificar el archivo translit.h en el directorio lib. Encuentra líneas que se vean así :

2 '"', 'o',

y reemplazarlos con algo como esto:

1, 'o',

me pasé horas en google tratando de averiguar la respuesta a este problema y finalmente decidió descargar la fuente y hackear con ella. ¡Espero que esto ayude a alguien!

0

Encontré una solución adecuada para mis necesidades (solo para aclarar: una secuencia de comandos obtiene una cadena y la convierte en una URL de "enlace permanente".

Mi solución consiste en tubería de la salida iconv a un filtro de sed:

echo á é ç this is a test | iconv -f utf8 -t ascii//TRANSLIT | sed 's/[^a-zA-Z 0-9]//g' 

El resultado para el anteriormente en OS X Yosemite es:

a e c this is a test 
0

Otra opción es utilizar unaccent que está instalado por brew install unac:

$ unaccent utf-8<<<é 
e 

unaccent no convierte caracteres en forma descompuesta (tales como LATIN SMALL LETTER E seguido por COMBINING ACUTE ACCENT), pero se puede utilizar uconv para convertir los caracteres en forma compuesta:

$ unaccent utf-8<<<$'e\u0301' 
é 
$ uconv -f utf-8 -t utf-8 -x NFC<<<$'e\u0301'|unaccent utf-8 
e 

brew install icu4c;ln -s /usr/local/opt/icu4c/bin/uconv /usr/local/bin instala uconv.