Domanda

Il mio programma deve leggere i file che utilizzano varie codifiche. Essi possono essere ANSI, UTF-8 o UTF-16 (endian grande o piccolo).

Quando il BOM (Byte Order Mark) è lì, non ho alcun problema. So che se il file è UTF-8 o UTF-16 BE o LE.

ho voluto assumere quando non vi era alcuna BOM che il file era ANSI. Ma ho scoperto che i file che sto trattando spesso mancano il loro BOM. Pertanto, non BOM può significare che il file è ANSI, UTF-8, UTF-16 BE o LE.

Quando il file non ha BOM, quale sarebbe il modo migliore per eseguire la scansione alcuni dei file e la maggior parte indovinare con precisione il tipo di codifica? Mi piacerebbe essere di destra vicino al 100% del tempo se il file è ANSI e in alta 90 se si tratta di un formato UTF.

Sto cercando un modo algoritmico generico per determinare questo. Ma io in realtà uso Delphi 2009, che conosce Unicode e ha una classe TEncoding, quindi qualcosa di specifico per che sarebbe un bonus.


Risposta:

risposta

di ShreevatsaR mi ha portato a cercare su Google per "la codifica universale rivelatore di Delphi", che mi ha sorpreso di avere questo post elencato nella posizione # 1 dopo essere stato in vita per solo circa 45 minuti! Questo è googlebotting veloce !! E anche sorprendente che StackOverflow entra nel 1 ° posto così in fretta.

La seconda voce nel Google era un blog di Fred Eaker su Character rilevazione codifica che gli algoritmi elencati in varie lingue.

Ho trovato la menzione di Delfi su quella pagina, e mi ha portato dritto al la libera OpenSource ChsDet Charset Detector su SourceForge scritto in Delphi e basato sul componente i18n di Mozilla.

Fantastico! Grazie a tutti coloro che hanno risposto (tutto +1), grazie ShreevatsaR, e grazie ancora StackOverflow, per avermi aiutato a trovare la mia risposta in meno di un'ora!

È stato utile?

Soluzione

Forse si può sborsare per uno script Python che utilizza Chardet: universale Codifica Detector . È una reimplementazione del rilevamento codifica dei caratteri usata da Firefox, ed è utilizzato da molte applicazioni differenti . Link utili: di Mozilla il codice , carta di ricerca si basava su (ironia della sorte, il mio Firefox non riesce a rilevare correttamente la codifica di quella pagina), < a href = "http://chardet.feedparser.org/docs/faq.html#faq.impossible" rel = "noreferrer"> breve spiegazione , dettagliata spiegazione .

Altri suggerimenti

Ecco come blocco note fa che

C'è anche il href="http://chardet.feedparser.org/docs/faq.html#faq.what" rel="nofollow noreferrer"> pitone universale di codifica Detector cui è possibile controllare.

La mia ipotesi è:

  • In primo luogo, verificare se il file ha valori di byte inferiore a 32 (ad eccezione di Tab / ritorni a capo). Se lo fa, non può essere ANSI o UTF-8. Così - UTF-16. Basta per capire l'endianness. Per questo probabilmente si dovrebbe usare un po 'tabella dei validi codici di caratteri Unicode. Se si verificano i codici non validi, provare l'altra endian se che si adatta. Se uno dei due in forma (o non), verificare che si ha più grande percentuale di codici alfanumerici. Inoltre si potrebbe provare searchung per interruzioni di riga e di determinare endianness da loro. Oltre a questo, non ho idee su come verificare la presenza di endianness.
  • Se il file non contiene valori inferiori a 32 (a parte ha dichiarato spazi bianchi), probabilmente è ANSI o UTF-8. Prova parsing come UTF-8 e vedere se si ottiene tutti i caratteri Unicode non validi. Se lo fai, probabilmente è ANSI.
  • Se vi aspettate che i documenti in non inglese a singolo byte o multi-byte codifiche non Unicode, allora sei fuori di fortuna. La cosa migliore che puoi fare è qualcosa di simile a Internet Explorer che rende un istogramma dei valori di carattere e lo confronta con istogrammi di lingue conosciute. Funziona abbastanza spesso, ma a volte non riesce troppo. E dovrete avere una grande biblioteca di lettera istogrammi per ogni lingua.

ASCII? Nessun sistema operativo moderno utilizza ASCII più. Tutti usano 8 codici bit, almeno, che significa che è UTF-8, ISOLatinX, WinLatinX, MacRoman, Shift-JIS o qualsiasi altra cosa è là fuori.

L'unico test che conosco è quello di verificare la presenza di validi UTF-8 caratteri. Se si trova qualcuno, poi si sa che non può essere UTF-8. Lo stesso è probabilmente possibile per UTF-16. Ma quando si tratta di nessun insieme Unicode, allora sarà difficile dire quale pagina di codice di Windows che potrebbe essere.

La maggior parte dei redattori che conosco affrontare questo lasciando all'utente di scegliere un valore predefinito dalla lista di tutte le possibili codifiche.

Non è il codice là fuori per verificare la validità dei caratteri UTF.

scroll top