GNU/Linux >> Linux Esercitazione >  >> Linux

Come ricodificare in modo condizionale in UTF-8?

Questo messaggio è piuttosto vecchio, ma penso di poter contribuire a questo problema:
Per prima cosa crea uno script chiamato recodeifneeded :

#!/bin/bash
# Find the current encoding of the file
encoding=$(file -i "$2" | sed "s/.*charset=\(.*\)$/\1/")

if [ ! "$1" == "${encoding}" ]
then
# Encodings differ, we have to encode
echo "recoding from ${encoding} to $1 file : $2"
recode ${encoding}..$1 $2
fi

Puoi usarlo in questo modo :

recodeifneeded utf-8 file.txt

Quindi, se ti piace eseguirlo in modo ricorsivo e modificare tutte le codifiche dei file *.txt in (diciamo) utf-8 :

find . -name "*.txt" -exec recodeifneeded utf-8 {} \;

Spero che questo aiuti.


Questo script, adattato dall'idea di harrymc, che ricodifica un file in modo condizionale (basato sull'esistenza di alcuni caratteri scandinavi con codifica UTF-8), sembra funzionare abbastanza bene per me.

$ cat recode-to-utf8.sh 

#!/bin/sh
# Recodes specified file to UTF-8, except if it seems to be UTF-8 already

result=`grep -c [åäöÅÄÖ] $1` 
if [ "$result" -eq "0" ]
then
    echo "Recoding $1 from ISO-8859-1 to UTF-8"
    recode ISO-8859-1..UTF-8 $1 # overwrites file
else
    echo "$1 was already UTF-8 (probably); skipping it"
fi

(L'elaborazione in batch dei file è ovviamente una semplice questione, ad esempio, di for f in *txt; do recode-to-utf8.sh $f; done .)

NB :questo dipende totalmente dal fatto che il file di script stesso sia UTF-8. E poiché questa è ovviamente una soluzione molto limitata adatta al tipo di file che mi capita di avere, sentiti libero di aggiungere risposte migliori che risolvono il problema in modo più generico.


UTF-8 ha regole rigide su quali sequenze di byte sono valide. Ciò significa che se i dati potrebbero essere UTF-8, raramente otterrai falsi positivi se presumi che lo sia .

Quindi puoi fare qualcosa del genere (in Python):

def convert_to_utf8(data):
    try:
        data.decode('UTF-8')
        return data  # was already UTF-8
    except UnicodeError:
        return data.decode('ISO-8859-1').encode('UTF-8')

In uno script di shell, puoi usare iconv per eseguire la conversione, ma avrai bisogno di un mezzo per rilevare UTF-8. Un modo è usare iconv con UTF-8 sia come codifica di origine che di destinazione. Se il file era UTF-8 valido, l'output sarà lo stesso dell'input.


Linux
  1. Come convertire file in codifica UTF-8 in Linux

  2. Come gestire le capacità dei file Linux

  3. Come rimuovere la Bom da un file Utf-8?

  4. Come grep \n nel file

  5. Come ordinare un file sul posto

Come montare file ISO su Linux

Come estrarre (decomprimere) il file tar.xz

Come creare file Tar Gz

Come decomprimere (aprire) il file Gz

Come collegare simbolicamente un file in Linux

Come fare eco in un file