Verificare e cambiare codifica file

Condivido una cosa che è servita a me, spiegandola in modo che sia comprensibile anche a chi ha meno dimestichezza con certi meccanismi di Linux.

Nei miei sistemi non avevo impostato l'utf-8. Ho deciso di farlo, però inevitabilmente poi mi sono trovato con alcuni file che avevano un'altra codifica, vedendoli con i classici caratteri strani.
Linux offre delle soluzioni molto semplici e già perfettamente integrate per questo problema.

Per verificare la codifica di un file abbiamo il classico comando file, con l'opzione --mime-encoding. In ogni caso anche usando file senza opzioni si visualizzarà la codifica, l'opzione --mime-encoding visualizzerà invece solo questo dato.
Un esempio su di un file di testo che chiameremo prova-codifiche.txt.
Il testo contenuto sarà "Prova codifica caratteri è ò à ù ì". I caratteri accentati verranno visualizzati in modo errato nel caso che il nostro sistema sia impostato su utf-8 e se il file sarà codificato ad esempio in iso-8859-1.

Infatti se diamo:

$ cat prova-codifiche.txt

(attenzione: il carattere "$" è il prompt dei comandi!)

otterremo qualcosa di questo tipo:

Prova codifica caratteri � � � �

Se daremo:

$ file --mime-encoding prova-codifiche.txt

il risultato sarà:

prova-codifiche.txt: iso-8859-1

Ora, se vogliamo modificarne la codifica dovremo farlo con un piccolo giro. Useremo un altro tool nativo di linux: iconv.
Come prima cosa dovremo ottenere un altro file dove verrà copiato il contenuto di questo ma con la codifica che vogliamo noi (ATTENZIONE: non fatelo sullo stesso file! Ma nemmeno usando il nome di un file esistente altrimenti con la redirezione > lo sovrascriverete distruggendone il contenuto!). In questo caso la nuova codifica sarà utf-8:

$ iconv -f iso-8859-1 -t utf-8 prova-codifiche.txt > prova-codifiche-utf-8.txt

(il file in cui verrà copiato il contenuto l'ho chiamato prova-codifiche-utf-8.txt, ma potete chiamarlo come volete, basta che non sia il nome del file originale e, RIPETO, nemmeno di un file esistente, altrimenti ne distruggerete il contenuto!)

Notare che le opzioni di iconv -f e -t corrispondono rispettivamente a --from-code=NOME e --to-code=NOME, dove NOME sta per il nome delle codifiche.
Potete vedere le codifiche disponibili nell'output di:

$ iconv -l

mentre con

$ iconv --help

potete leggere il semplice aiuto di questo comando.

Tornando al cambio di codifica del nostro file, potremo decidere di sovrascrivere il file originale con quello codificato nella nuova codifica:

$ mv prova-codifiche-utf-8.txt prova-codifiche.txt

Se ora daremo di nuovo:

$ file --mime-encoding prova-codifiche.txt

otterremo:

prova-codifiche.txt: utf-8

e se daremo un cat:

$ cat prova-codifica.txt

il risultato sarà:

Prova codifica caratteri è ò à ù ì

I caratteri accentati saranno visualizzati correttamente nel nostro sistema impostato su utf-8.

Un'ultima cosa, tutto questo volendo si potrebbe includere in uno script che, combinando il comando find, potrebbe convertire tutti i file presenti in una o più directory, o in tutto il computer, da altre codifiche a utf-8, o a quello che ci interessa.

Saluti! :)

Luigi aka Gigi... aka Wolf! :D