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-code | Codificació del fitxer original |
-t, --to-code | Codificació que vols obtenir |
-o, --output | Fitxer de sortida |
-c | Omet els caràcters que no es poden convertir, en lloc d’aturar-se |
-l | Llista totes les codificacions disponibles |
//TRANSLIT | Afegit 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.txtel deixa buit, perquè el shell el buida abans queiconvel llegeixi. Converteix a un fitxer nou i després substitueix l’original ambmv. - 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 ambfile. - Els finals de línia de Windows (CRLF) no són cosa de la codificació:
iconvels deixa igual. Per passar-los a format Unix, fes servirdos2unixosed -i 's/\r$//' fitxer.txt.
Comandes relacionades
file: detectar la codificació d’un fitxer.catiless: veure el contingut del fitxer convertit.- Manipular text amb les GNU textutils.