Come posso vedere quale codifica viene utilizzata in un file


23

Ho avuto dei problemi con i file dei sottotitoli nel video omxplayer. Per risolverlo ho dovuto convertire da Windows-1250 a codifica UTF-8. La mia domanda è: come posso vedere per alcuni file specifici quale codifica viene utilizzata?


piconvper cambiare la codifica;)
Rinzwind il

Sì. Ho già cambiato la codifica (in 1 file). Ma ne ho molti e volevo realizzare dei piccoli script che li controllassero tutti e poi, se necessario, li nascondessero. Ma suppongo che posso semplicemente convertirli tutti. Nessun danno verrà fatto se alcuni sono già in UTF-8. Destra?
Modello non standard,

Non è un problema no :) Usa solo un carattere jolly
Rinzwind

Risposte:


26

Non puoi davvero scoprire automaticamente se un file è stato scritto con la codifica X in origine.

Quello che puoi facilmente fare è verificare se il file completo può essere decodificato con successo in qualche modo (ma non necessariamente correttamente) usando un codec specifico. Se trovi byte non validi per una determinata codifica, deve essere qualcos'altro.

Il problema è che molti codec sono simili e hanno gli stessi "schemi di byte validi", interpretandoli semplicemente come caratteri diversi. Ad esempio, äuna codifica in una potrebbe corrispondere a éin un'altra o øin una terza. Il computer non è in grado di rilevare in che modo interpretare il byte si traduca in un testo leggibile correttamente dall'uomo (a meno che forse non si aggiunga un dizionario per tutti i tipi di lingue e si permetta di eseguire i controlli ortografici ...). Devi anche sapere che alcuni set di caratteri sono in realtà sottoinsiemi di altri, come ad esempio la codifica ASCII fa parte dei codec più comunemente usati come alcuni della famiglia ANSI o UTF-8. Ciò significa ad esempio un testo salvato come UTF-8 che contiene solo caratteri latini semplici, sarebbe identico allo stesso file salvato come ASCII.


Tuttavia, torniamo indietro dalla spiegazione di ciò che non puoi fare a ciò che puoi effettivamente fare:

Per un controllo di base sui file di testo ASCII / non ASCII (normalmente UTF-8), è possibile utilizzare il filecomando. Tuttavia, non conosce molti codec ed esamina solo i primi kB di un file, supponendo che il resto non conterrà nuovi caratteri. D'altra parte, riconosce anche altri tipi di file comuni come vari script, documenti HTML / XML e molti formati di dati binari (il che non è affatto interessante per il confronto di file di testo) e potrebbe stampare informazioni aggiuntive se ci sono righe estremamente lunghe o cosa viene utilizzato il tipo di sequenza newline (ad es. UNIX: LF, Windows: CR + LF).

$ cat ascii.txt 
I am an ASCII file.
Just text and numb3rs and simple punctuation...

$ cat utf8.txt 
I am a Unicode file.
Special characters like Ω€®Ŧ¥↑ıØÞöäüß¡!

$ file ascii.txt utf8.txt 
ascii.txt: ASCII text
utf8.txt:  UTF-8 Unicode text

Se ciò non bastasse, posso offrirti lo script Python che ho scritto per questa risposta qui , che analizza i file completi e tenta di decodificarli utilizzando un set di caratteri specificato. Se riesce, quella codifica è un potenziale candidato. Altrimenti se ci sono byte che non possono essere decodificati con esso, puoi rimuovere quel set di caratteri dal tuo elenco.


ANSI non è proprio il nome di nessuna codifica di caratteri. Forse stai pensando ai codici di escape ANSI, che possono essere espressi con la codifica dei caratteri ASCII.
Kasperd,

@kasperd Molto probabilmente si sta riferendo a una famiglia di codici ISO 8859 o Window. Per gli sviluppatori di windows nordamericani, la codifica ANSI spesso significa la codifica di Windows 1252 per motivi storici.
user1937198,

Sì, bene, ANSI è fondamentalmente ASCII (codici 0-127) più una tabella codici specifica per le impostazioni locali (codici 128-255). Quindi hai ragione ...
Byte Commander

Ulteriori informazioni: che cos'è il formato ANSI?
wjandrea,

12

Un programma chiamato filepuò farlo. Esempio:

$ echo aaa >> FILE
$ file FILE
FILE: ASCII text, with CRLF, LF line terminators
$ echo öäü >> FILE
$ file FILE
FILE: UTF-8 Unicode text, with CRLF, LF line terminators

Se sei interessato a come è fatto, vedi src/encoding.c.


2
Può indovinare , comunque.
Hobbs

2
filefa un'ipotesi, e spesso non è molto buona. Ad esempio, nei miei test ha identificato erroneamente sia MacRoman che CP-1252 come ISO-8859, con il risultato che "š" e "ß" sono stati confusi.
Segna il

Ottimo 👌! Ho trascorso alcune ore a trovare la codifica corretta del mio vecchio .sqlfile e fileho mostrato che è davvero un gzipfile compresso!
Amirreza Nasiri,
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.