2011-06-24 08:07:02 +0000 2011-06-24 08:07:02 +0000
74
74

Come rilevare automaticamente la codifica dei file di testo?

Ci sono molti file di testo semplice che sono stati codificati in charset diversi.

Voglio convertirli tutti in UTF-8, ma prima di eseguire iconv, ho bisogno di conoscere la sua codifica originale. La maggior parte dei browser ha un'opzione Auto Detect nelle codifiche, tuttavia, non posso controllare quei file di testo uno per uno perché sono troppi.

Solo conoscendo la codifica originale, posso poi convertire i testi con iconv -f DETECTED_CHARSET -t utf-8.

C'è qualche utility per rilevare la codifica dei file di testo semplice? NON deve essere perfetto al 100%, non mi importa se ci sono 100 file mal convertiti su 1.000.000 di file.

Risposte (9)

62
62
62
2011-06-24 08:37:06 +0000

Prova il modulo Python chardet , che è disponibile su PyPi:

pip install chardet

Poi esegui chardetect myfile.txt.

Chardet è basato sul codice di rilevamento usato da Mozilla, quindi dovrebbe dare risultati ragionevoli, a condizione che il testo di input sia abbastanza lungo per l'analisi statistica. Leggete la documentazione del progetto .

Come detto nei commenti è abbastanza lento, ma alcune distribuzioni forniscono anche la versione originale C++ come @Xavier ha trovato in https://superuser.com/a/609056 . C'è anche una versione Java da qualche parte.

30
30
30
2013-06-18 12:44:37 +0000

Su Linux basato su Debian, il pacchetto uchardet Debian / Ubuntu ) fornisce uno strumento a riga di comando. Vedi sotto la descrizione del pacchetto:

universal charset detection library - cli utility
 .
 uchardet is a C language binding of the original C++ implementation
 of the universal charset detection library by Mozilla.
 .
 uchardet is a encoding detector library, which takes a sequence of
 bytes in an unknown character encoding without any additional
 information, and attempts to determine the encoding of the text.
 .
 The original code of universalchardet is available at
 http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet
 .
 Techniques used by universalchardet are described at
 http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html
16
16
16
2011-06-24 08:38:40 +0000

Per Linux, c'è enca e per Solaris potete usare auto_ef .

2
2
2
2013-10-11 16:06:44 +0000

Mozilla ha un bel codice base per il rilevamento automatico nelle pagine web: http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet/src/

Descrizione dettagliata dell'algoritmo: http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html

2
2
2
2018-11-06 15:42:35 +0000

Per coloro che usano regolarmente Emacs, potrebbero trovare utile quanto segue (permette di ispezionare e convalidare manualmente la trasfomazione).

Inoltre trovo spesso che il rilevamento automatico dei set di caratteri di Emacs sia molto più efficiente degli altri strumenti di rilevamento automatico dei set di caratteri (come chardet).

(setq paths (mapcar 'file-truename '(
 "path/to/file1"
 "path/to/file2"
 "path/to/file3"
)))

(dolist (path paths)
  (find-file path)
  (set-buffer-file-coding-system 'utf-8-unix)
  )

Poi, una semplice chiamata a Emacs con questo script come argomento (vedere l'opzione “-l”) fa il lavoro.

1
1
1
2015-10-28 17:34:06 +0000

isutf8 (dal pacchetto moreutils) ha fatto il lavoro

1
1
1
2014-01-23 16:12:16 +0000

Tornando a chardet (python 2.?) questa chiamata potrebbe essere sufficiente:

python -c 'import chardet,sys; print chardet.detect(sys.stdin.read())' < file
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}

Anche se è lontano dalla perfezione….

echo "öasd" | iconv -t ISO-8859-1 | python -c 'import chardet,sys; print chardet.detect(sys.stdin.read())'
{'confidence': 0.5, 'encoding': 'windows-1252'}
1
1
1
2011-09-03 00:48:04 +0000

UTFCast vale la pena di provare. Non ha funzionato per me (forse perché i miei file sono terribili) ma sembra buono. http://www.addictivetips.com/windows-tips/how-to-batch-convert-text-files-to-utf-8-encoding/

0
0
0
2019-07-12 16:39:09 +0000

Anche nel caso in cui il file -i ti dia

sconosciuto puoi usare questo comando php che può indovinare il charset come sotto:

In php puoi controllare come segue:

Specificando esplicitamente la lista delle codifiche:

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), 'UTF-8, ASCII, JIS, EUC-JP, SJIS, iso-8859-1') . PHP_EOL;"

Più preciso “ mb_list_encodings”:

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), mb_list_encodings()) . PHP_EOL;"

Qui nel primo esempio, potete vedere che ho messo una lista di codifiche (individuare l'ordine della lista) che potrebbero corrispondere. Per avere un risultato più accurato potete usare tutte le codifiche possibili tramite : mb\listencodings()_

Nota le funzioni mb_* richiedono php-mbstring

apt-get install php-mbstring

Vedi risposta : https://stackoverflow.com/a/57010566/3382822