Gestionar fitxers i directoris a Linux

La comanda iconv a Linux: convertir la codificació de fitxers de text



La comanda iconv converteix fitxers de text d’una codificació de caràcters a una altra: de Latin-1 (ISO-8859-1) o Windows-1252 a UTF-8, o al revés. És la solució quan obres un fitxer i, en lloc de què o Pingüí, hi veus qu� o què: el fitxer és en una codificació i el programa l’està llegint com si fos una altra.

Avui pràcticament tot Linux treballa en UTF-8, però encara és habitual trobar fitxers en Latin-1 o Windows-1252: exportacions CSV d’Excel, bases de dades i webs antigues, fitxers de programes de Windows…

Sintaxi

iconv -f codificació_origen -t codificació_destí [fitxer...] [-o fitxer_sortida]

Si no indiques -o, el resultat surt per pantalla (i el pots redirigir amb >). Si no indiques cap fitxer, llegeix de l’entrada estàndard.

Opcions més útils

OpcióQuè fa
-f, --from-codeCodificació del fitxer original
-t, --to-codeCodificació que vols obtenir
-o, --outputFitxer de sortida
-cOmet els caràcters que no es poden convertir, en lloc d’aturar-se
-lLlista totes les codificacions disponibles
//TRANSLITAfegit a la codificació de destí, substitueix els caràcters que no hi existeixen per equivalents aproximats

Primer: saber quina codificació té el fitxer

Fes servir file:

$ file antic.txt notes.txt
antic.txt: ISO-8859 text, with CRLF line terminators
notes.txt: Unicode text, UTF-8 text

file no distingeix entre ISO-8859-1 i Windows-1252 en la majoria dels casos. Si el fitxer ve de Windows (Excel, Bloc de notes antic…), tria WINDOWS-1252: és un superconjunt de Latin-1 que inclou, per exemple, el símbol de l’euro (€) i les cometes tipogràfiques.

Exemples

Convertir un fitxer de Latin-1 a UTF-8:

$ iconv -f ISO-8859-1 -t UTF-8 antic.txt -o antic_utf8.txt
$ file antic_utf8.txt
antic_utf8.txt: Unicode text, UTF-8 text, with CRLF line terminators

Convertir un CSV exportat des d’Excel a Windows:

iconv -f WINDOWS-1252 -t UTF-8 vendes.csv -o vendes_utf8.csv

L’elecció importa. Un fitxer de Windows amb un €, convertit com si fos Latin-1, dona un caràcter de control invisible en lloc de l’euro; convertit com a Windows-1252, surt bé:

$ iconv -f WINDOWS-1252 -t UTF-8 preus.txt
Preu: 10 €

Convertir de UTF-8 a Latin-1, per a un programa antic que no entén UTF-8:

$ iconv -f UTF-8 -t ISO-8859-1 nou.txt -o antic.txt
iconv: illegal input sequence at position 9

L’error vol dir que hi ha un caràcter que no existeix a Latin-1 (aquí, el €). Tens tres opcions:

# Latin-9 (ISO-8859-15), que sí que té l'euro
iconv -f UTF-8 -t ISO-8859-15 nou.txt -o antic.txt

# Substituir el que no existeixi per una aproximació
iconv -f UTF-8 -t ISO-8859-1//TRANSLIT nou.txt -o antic.txt

# Eliminar-ho directament
iconv -c -f UTF-8 -t ISO-8859-1 nou.txt -o antic.txt

Passar a ASCII pur, treient els accents (útil per generar noms de fitxer o identificadors):

$ echo "Pingüí €" | iconv -f UTF-8 -t ASCII//TRANSLIT
Pingui EUR

Netejar un fitxer UTF-8 que té bytes invàlids (per exemple, un log on s’han barrejat codificacions):

iconv -c -f UTF-8 -t UTF-8 log_trencat.txt -o log_net.txt

Convertir tots els .txt d’un directori, deixant els originals intactes:

mkdir -p utf8
for f in *.txt; do iconv -f WINDOWS-1252 -t UTF-8 "$f" -o "utf8/$f"; done

Llistar les codificacions disponibles (n’hi ha centenars, i moltes tenen àlies):

iconv -l
iconv -l | grep -i 1252

Compte amb…

  • No redirigeixis la sortida al mateix fitxer que llegeixes: iconv -f ISO-8859-1 -t UTF-8 dades.txt > dades.txt el deixa buit, perquè el shell el buida abans que iconv el llegeixi. Converteix a un fitxer nou i després substitueix l’original amb mv.
  • No converteixis dues vegades: si passes a UTF-8 un fitxer que ja era UTF-8 com si fos Latin-1, obtens el típic è en lloc de è. Comprova-ho sempre abans amb file.
  • Els finals de línia de Windows (CRLF) no són cosa de la codificació: iconv els deixa igual. Per passar-los a format Unix, fes servir dos2unix o sed -i 's/\r$//' fitxer.txt.

Comandes relacionades