algorithm - without - vim remove bom




Come posso indovinare la codifica quando manca il BOM(Byte Order Mark)? (3)

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

L'unico test che conosco è verificare i caratteri UTF-8 non validi. Se ne trovi, allora sai che non può essere UTF-8. Lo stesso è probabilmente possibile per UTF-16. Ma quando non è impostato su Unicode, sarà difficile stabilire quale codice di Windows potrebbe essere.

La maggior parte degli editori che conosco si occupano di questo lasciando che l'utente scelga un valore predefinito dall'elenco di tutte le codifiche possibili.

C'è un codice là fuori per verificare la validità dei caratteri UTF.

Il mio programma deve leggere i file che utilizzano varie codifiche. Possono essere ANSI, UTF-8 o UTF-16 (big o little endian).

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

Volevo dare per scontato quando non c'era un BOM che il file fosse ANSI. Ma ho scoperto che i file con cui ho a che fare spesso mancano del loro BOM. Pertanto nessuna distinta base 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 di alcuni file e indovinare con precisione il tipo di codifica? Mi piacerebbe essere vicino al 100% delle volte se il file è ANSI e negli alti 90 se è un formato UTF.

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

Risposta:

La risposta di ShreevatsaR mi ha spinto a cercare su Google "universal encoding detector delphi" che mi ha sorpreso nel vedere questo post elencato nella posizione numero 1 dopo essere stato in vita per solo circa 45 minuti! Questo è googlebotting veloce !! E anche sorprendente che Stackoverflow arrivi al 1 ° posto così velocemente.

La seconda voce di Google era un post di blog di Fred Eaker su Rilevamento della codifica dei caratteri che elencava gli algoritmi in varie lingue.

Ho trovato la menzione di Delphi in quella pagina, e mi ha portato direttamente al Free Charity Detector ChsDet su SourceForge scritto in Delphi e basato sul componente i18n di Mozilla.

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



La mia ipotesi è:

  • Innanzitutto, controlla se il file ha valori di byte inferiori a 32 (eccetto per tab / newlines). Se lo fa, non può essere ANSI o UTF-8. Quindi - UTF-16. Basta capire il endianness. Per questo dovresti probabilmente usare una tabella di codici carattere Unicode validi. Se incontri codici non validi, prova l'altro endianness se ciò si adatta. Se si adatta (o non si), verificare quale ha una maggiore percentuale di codici alfanumerici. Inoltre potresti provare a cercare le interruzioni di riga e determinare l'endianità da esse. Oltre a questo, non ho idee su come controllare l'endianità.
  • Se il file non contiene valori inferiori a 32 (oltre a detti spazi bianchi), è probabilmente ANSI o UTF-8. Prova ad analizzarlo come UTF-8 e vedere se ottieni caratteri Unicode non validi. Se lo fai, probabilmente è ANSI.
  • Se si prevedono documenti in codifiche non Unicode a byte singolo o multibyte non inglesi, non si è fortunati. La cosa migliore che puoi fare è qualcosa come Internet Explorer che crea un istogramma dei valori dei caratteri e lo confronta con gli istogrammi delle lingue conosciute. Funziona abbastanza spesso, ma a volte fallisce anche. E dovrai avere una grande libreria di istogrammi di lettere per ogni lingua.




byte-order-mark