Come rilevare la codifica di un file?


115

Sul mio filesystem (Windows 7) ho alcuni file di testo (questi sono file di script SQL, se questo è importante).

Se aperto con Notepad ++ , nel menu "Codifica" alcuni di essi hanno una codifica di "UCS-2 Little Endian" e alcuni di "UTF-8 senza BOM".

Qual è la differenza qui? Sembrano tutti essere script perfettamente validi. Come potrei dire quali codifiche ha il file senza Notepad ++?


7
Esiste un modo abbastanza semplice con Firefox. Apri il tuo file usando Firefox, quindi Visualizza> Codifica caratteri. Dettagliato qui .
Catherine Gasnier,

usare l'euristica. cassa encae chardetper sistemi POSIX.
Janus Troelsen,

3
Penso che una risposta alternativa sia PROVA ed ERRORE. iconvin particolare è utile per questo scopo. Sostanzialmente si ripetono le stringhe / il testo di caratteri corrotti attraverso diverse codifiche per vedere quale funziona. Vinci, quando i personaggi non sono più corrotti. Mi piacerebbe rispondere qui, con un esempio programmatico. Ma purtroppo è una domanda protetta.
Brandon Bertelsen,

FF utilizza Mozilla Charset Detector . Un altro modo semplice è aprire il file con MS Word, indovinerà i file in modo abbastanza corretto anche per varie antiche
tabelle

Se chardeto chardetectnon è disponibile sul proprio sistema, è possibile installare il pacchetto tramite il proprio gestore pacchetti (ad es apt search chardet. Su ubuntu / debian il pacchetto viene solitamente chiamato python-chardeto python3-chardet) o tramite pip con pip install chardet(o pip install cchardetper la versione ottimizzata c più veloce).
ccpizza,

Risposte:


97

I file generalmente indicano la loro codifica con un'intestazione del file. Ci sono molti esempi qui . Tuttavia, anche leggendo l'intestazione non si può mai essere sicuri di quale codifica un file stia realmente utilizzando .

Ad esempio, un file con i primi tre byte 0xEF,0xBB,0xBFè probabilmente un file codificato UTF-8. Tuttavia, potrebbe essere un file ISO-8859-1 che inizia con i caratteri . Oppure potrebbe essere un tipo di file completamente diverso.

Notepad ++ fa del suo meglio per indovinare quale codifica sta utilizzando un file e il più delle volte lo fa nel modo giusto. A volte, però, è sbagliato: ecco perché il menu "Codifica" è lì, quindi puoi ignorare la sua ipotesi migliore.

Per le due codifiche menzionate:

  • I file "UCS-2 Little Endian" sono file UTF-16 (in base a ciò che ho capito dalle informazioni qui ) quindi probabilmente iniziano con 0xFF,0xFEi primi 2 byte. Da quello che posso dire, Notepad ++ li descrive come "UCS-2" poiché non supporta alcuni aspetti di UTF-16.
  • I file "UTF-8 senza BOM" non hanno byte di intestazione. Questo è ciò che significa il bit "senza BOM".


2
Perché un file che inizia con una distinta base viene rilevato automaticamente come "UTF-8 senza distinta materiali"?
Michael Borgwardt,

2
E se un file è iniziato con 0xFF, 0xFE, dovrebbe essere rilevato automaticamente come UTF-16, non UCS-2. UCS-2 è probabilmente indovinato perché contiene principalmente caratteri ASCII e quindi ogni altro byte è nullo.
Michael Borgwardt,

2
Con l'esperienza, purtroppo, anche i metadati ("intestazioni") possono essere sbagliati. Il database che contiene le informazioni potrebbe essere danneggiato o l'autore del caricamento originale potrebbe aver sbagliato. (Questo è stato un problema significativo per noi negli ultimi mesi; alcuni dati sono stati caricati come "UTF-8" tranne per il fatto che era "veramente ISO8859-1, dal momento che sono gli stessi davvero ?!" Bah! Gli scienziati dovrebbero essere tenuti lontano dall'origine dei metadati; sbagliano solo ...)
Donal Fellows

1
In realtà penso che sia "divertente" che il problema di codifica rimanga ancora nel 2014 poiché nessun file al mondo inizierà con "ï» ¿"e sono molto sorpreso quando vedo una pagina HTML che è stata caricata con una codifica errata. È una questione di probabilità. È impensabile scegliere la codifica sbagliata se un'altra codifica eviterebbe caratteri strani .. Cercare la codifica che evita caratteri strani funzionerebbe nel 99,9999% dei casi, credo. Ma ci sono ancora errori .. Inoltre è un messaggio molto confuso usare ascii invece di UTF8 per risparmiare spazio .. è sconcertante per gli sviluppatori junior questa idea di esibirsi ..
Revious

18

Non puoi. Se potessi farlo, non ci sarebbero così tanti siti Web o file di testo con "incomprensioni casuali" là fuori. Ecco perché la codifica viene generalmente inviata insieme al payload come metadati.

In caso contrario, tutto ciò che puoi fare è una "ipotesi intelligente", ma il risultato è spesso ambiguo poiché la stessa sequenza di byte potrebbe essere valida in più codifiche.


2
OK, quindi, il sistema operativo Windows memorizza tali informazioni (metadati) effettivamente da qualche parte? Nel registro probabilmente?
Marcel,

Hai torto. Questa è una tabella codici, non è la stessa cosa. Esistono algoritmi da indovinare con la codifica Unicode.
DeadMG

6
@Marcel: No. Ecco perché i "file di testo" sono così problematici per tutto tranne che per ASCII puro.
Michael Borgwardt,

bene notepad ++ può farlo, può dirti se il file di testo è codificato utf-8 oppure no
user25
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.