Come posso testare la codifica di un file di testo ... È valido e che cos'è?


46

Ho diversi .htmfile che si aprono in Gedit senza alcun avviso / errore, ma quando apro questi stessi file Jedit, mi avvisa della codifica UTF-8 non valida ...

Il meta tag HTML indica "charset = ISO-8859-1". Jedit consente un elenco di codifiche di fallback e un elenco di rilevatori automatici di codifica (attualmente "BOM XML-PI"), quindi il mio problema immediato è stato risolto. Ma questo mi ha fatto pensare: e se i metadati non esistessero?

Quando le informazioni di codifica non sono disponibili, esiste un programma CLI che può fare una "ipotesi" su quali codifiche possono essere applicate?

E, sebbene sia un problema leggermente diverso; esiste un programma CLI che verifica la validità di una codifica nota ?


Simile a "Come rilevare automaticamente la codifica dei file di testo?" superuser.com/questions/301552/…
buzz3791

Risposte:


60

Il filecomando fa "ipotesi" sulla codifica. Utilizzare il -iparametro per forzare la filestampa di informazioni sulla codifica.

Dimostrazione:

$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-utf16.txt:    text/plain; charset=utf-16le
umlaut-utf8.txt:     text/plain; charset=utf-8

Ecco come ho creato i file:

$ echo ä > umlaut-utf8.txt 

Oggi tutto è utf-8. Ma convinciti:

$ hexdump -C umlaut-utf8.txt 
00000000  c3 a4 0a                                          |...|
00000003

Confronta con https://en.wikipedia.org/wiki/Ä#Computer_encoding

Converti in altre codifiche:

$ iconv -f utf8 -t iso88591 umlaut-utf8.txt > umlaut-iso88591.txt 
$ iconv -f utf8 -t utf16 umlaut-utf8.txt > umlaut-utf16.txt 

Controlla la discarica esadecimale:

$ hexdump -C umlaut-iso88591.txt 
00000000  e4 0a                                             |..|
00000002
$ hexdump -C umlaut-utf16.txt 
00000000  ff fe e4 00 0a 00                                 |......|
00000006

Crea qualcosa di "non valido" mescolando tutti e tre:

$ cat umlaut-iso88591.txt umlaut-utf8.txt umlaut-utf16.txt > umlaut-mixed.txt 

Cosa filedice:

$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-mixed.txt:    application/octet-stream; charset=binary
umlaut-utf16.txt:    text/plain; charset=utf-16le
umlaut-utf8.txt:     text/plain; charset=utf-8

senza -i:

$ file *
umlaut-iso88591.txt: ISO-8859 text
umlaut-mixed.txt:    data
umlaut-utf16.txt:    Little-endian UTF-16 Unicode text, with no line terminators
umlaut-utf8.txt:     UTF-8 Unicode text

Il filecomando non ha idea di "valido" o "non valido". Vede solo alcuni byte e prova a indovinare quale potrebbe essere la codifica. Come umani potremmo essere in grado di riconoscere che un file è un file di testo con alcune sfumature in una codifica "errata". Ma come computer avrebbe bisogno di una sorta di intelligenza artificiale.

Si potrebbe sostenere che l'euristica di fileuna sorta di intelligenza artificiale. Tuttavia, anche se lo è, è molto limitato.

Ecco ulteriori informazioni sul filecomando: http://www.linfo.org/file_command.html


Grazie, ha funzionato ... Avevo provato 'file , but without any option :( ... I've now also tried a mixof UTF-16 and UTF-8 and ISO-8859-1. file -i` segnalato unknown-8bit. Quindi, questa sembra essere anche la risposta a: "Come rilevare una codifica non valida / sconosciuta"
Peter.O

Per coloro che arrivano qui e sono su Mac, è file -Icon una "i" maiuscola anziché minuscola.
Samuraiseoul,

21

Non è sempre possibile scoprire con certezza quale sia la codifica di un file di testo. Ad esempio, la sequenza di byte \303\275( c3 bdin esadecimale) potrebbe essere ýin UTF-8 ý, o Ă˝in latino1, o in latino2, o in BIG-5 e così via.

Alcune codifiche hanno sequenze di byte non valide, quindi è possibile escluderle di sicuro. Ciò vale in particolare per UTF-8; la maggior parte dei testi nella maggior parte delle codifiche a 8 bit non sono valide UTF-8. Puoi provare UTF-8 valido con isutf8da moreutils o con iconv -f utf-8 -t utf-8 >/dev/null, tra gli altri.

Esistono strumenti che tentano di indovinare la codifica di un file di testo. Possono commettere errori, ma spesso funzionano in pratica finché non si tenta deliberatamente di ingannarli.

  • file
  • PerlEncode::Guess (parte della distribuzione standard) prova successive codifiche su una stringa di byte e restituisce la prima codifica in cui la stringa è un testo valido.
  • Enca è un indovinello e un convertitore di codifica. Puoi dargli un nome di lingua e un testo che presumi sia in quella lingua (le lingue supportate sono principalmente lingue dell'Europa orientale) e prova a indovinare la codifica.

Se ci sono metadati (HTML / XML charset=, TeX \inputenc, emacs -*-coding-*-, ...) nel file, gli editor avanzati come Emacs o Vim sono spesso in grado di analizzare quei metadati. Tuttavia, non è facile automatizzare dalla riga di comando.


Grazie per la buona panoramica ... Sì, "best-indovina" può essere l'unica opzione quando la codifica non è nota ... Utilizzando iconv, ho appena eseguito tutte le 1168 codifiche (compresi gli alias) elencate da iconv -luno dei miei file .htm ... Ci sono state 683 codifiche che hanno superato la raccolta. Il set di caratteri effettivo del file = ISO-8859-1 .. costituito da tutti i valori di intervallo ASCII della barra uno. Il carattere non ASCII era \ xA9.
Peter.O

0

Anche nel caso in cui il file -i ti dia sconosciuto

Puoi usare questo comando php che può indovinare charset come di seguito:

In php puoi controllare come di seguito:

Specificare esplicitamente l'elenco di codifica:

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

" Mb_list_encodings " più accurati :

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

Qui nel primo esempio, puoi vedere che ho messo un elenco di codifiche (rileva l'ordine delle liste) che potrebbero corrispondere. Per ottenere risultati più precisi è possibile utilizzare tutte le codifiche possibili tramite: mb_list_encodings ()

Nota le funzioni mb_ * richiedono php-mbstring

apt-get install php-mbstring 

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.