2009-04-30 6 views
5

Je suis sur Mac Os X 10.5 (mais je reproduis la question sur 10.4)Comment réparer problème bizarre avec iconv sur Mac Os x

Je suis en train d'utiliser iconv convertir un UTF- fichier ASCII 8 à

le fichier utf-8 contient des caractères comme « eac »

Je veux que les caractères accentués à être transformés en leur équivalent le plus proche ascii

si

ma commande est la suivante:

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

qui fonctionne très bien sur une machine Linux

mais sur mon Mac Os locaux XI obtenir ce par exemple:

è => « e

à =>` un

Je ne vraiment undersatnd pourquoi iconv retourne cette sortie bizarre sur mac os x, mais tout va bien sur linux

toute aide? ou des directions?

merci à l'avance

+0

Quelle est la sortie que vous obtenez sur Linux? – kch

+0

et que trouvez-vous bizarre à propos de la sortie mac? utilisez-vous l'iconv fourni par Apple ou l'avez-vous installé via macports, compilé vous-même, autre chose? – kch

+0

salut sur linux: é => e, à => un –

Répondre

0

je suppose que sur votre machine linux l'environnement local est défini différemment ... pour autant que je me souvienne, iconv utilise les paramètres régionaux en cours pour traduire UTF-X, et par défaut, le macos a les paramètres régionaux réglé sur « C » qui (évidemment) ne gère pas les accents et les caractères spécifiques du langage ... peut-être essayer de faire cela avant iconv courir:

setLocale(LC_ALL, "en_EN"); 

| K <

+0

salut merci mais cela ne semble pas être le problème comme je l'ai changé les paramètres régionaux mais ça n'a rien changé. Ou je ne sais pas comment changer réellement le lieu que je fais dans mon .bash_profile export LC_ALL = fr_FR.UTF-8 et retourne locale en cours d'exécution: 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 " espérons que cela aide à trouver une réponse –

8

le problème est que Mac OS X utilise une autre implémentation de iconv appelée libiconv. La plupart des distributions Linux ont une implémentation de iconv qui fait partie de libc. Malheureusement, libiconv translittère les caractères tels que ö, è et ñ en "o,` e et ~ N. La seule façon de résoudre ce problème est de télécharger la source et de modifier le fichier translit.h dans le répertoire lib. :

2, '"', 'o',

et les remplacer par quelque chose comme ceci:

1, 'o',

Je passais des heures sur Google à essayer de comprendre la réponse à ce problème et a finalement décidé de télécharger la source et pirater avec elle. J'espère que cela aide quelqu'un!

0

J'ai trouvé une solution de contournement adaptée à mes besoins (juste pour clarifier: un script obtient une chaîne et la convertit en URL "permalien".

Ma solution consiste en redirigeant la sortie iconv à un filtre sed:

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

Le résultat de ce qui précède dans OS X Yosemite est:

a e c this is a test 
0

Une autre option consiste à utiliser unaccent qui est installé par brew install unac:

$ unaccent utf-8<<<é 
e 

unaccent ne convertit pas les caractères sous forme décomposées (tels que LATIN SMALL LETTER E suivi par COMBINING ACUTE ACCENT), mais vous pouvez utiliser uconv pour convertir les caractères en forme composée:

$ 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 installe uconv.