2009-04-21 15 views
43

Sto cercando un modo per rilevare i set di caratteri all'interno dei documenti. Ho letto l'attuazione di rilevamento set di caratteri Mozilla qui:Algoritmo di rilevamento codifica caratteri

Universal Charset Detection

ho anche trovato un'implementazione Java di questa chiamata jCharDet:

JCharDet

Entrambi si basano su ricerca effettuata utilizzando un set di dati statici. Quello che mi chiedo è se qualcuno ha usato con successo qualsiasi altra implementazione e se sì cosa? Hai rotolato il tuo approccio e, in caso affermativo, qual è stato l'algoritmo che hai usato per rilevare il set di caratteri?

Qualsiasi aiuto sarebbe apprezzato. Io non sto cercando una lista di approcci esistenti tramite Google, né sono in cerca di un link per l'articolo Joel Spolsky - tanto per chiarire:)

UPDATE: ho fatto un po 'di ricerca in questo e finito per trovare un quadro chiamato cpdetector che utilizza un approccio plug al rilevamento dei caratteri, vedere:

CPDetector

Questo fornisce BOM, chardet (approccio di Mozilla) e plugin di rilevamento ASCII. È anche molto facile da scrivere. C'è anche un altro quadro, che fornisce il rilevamento carattere molto meglio che l'approccio di Mozilla/jchardet ecc ...

ICU4J

E 'abbastanza facile da scrivere il proprio plug-in per cpdetector che utilizza questo contesto per fornire un carattere più accurata algoritmo di rilevamento della codifica. Funziona meglio dell'approccio di Mozilla.

+0

È un problema difficile. Grazie per gli ottimi collegamenti dalla tua ricerca. – erickson

+0

C'è un caso famoso di questo: http://blogs.msdn.com/oldnewthing/archive/2007/04/17/2158334.aspx – McDowell

+0

Sì, passato il problema del blocco note, correggerò il mio post con la mia ricerca una volta che ho finito e completato, alcune cose interessanti ... – Jon

risposta

9

anni fa abbiamo rilevato il set di caratteri per un'applicazione di posta elettronica e abbiamo eseguito il rollover. L'app di posta era in realtà un'applicazione WAP e il telefono prevedeva UTF-8. C'erano diverse fasi:

universali

Potremmo facilmente rilevare se testo era UTF-8, in quanto v'è un modello specifico bit nei bit superiori del byte 2/3/ecc. Una volta che hai trovato quel modello ripetuto un certo numero di volte, puoi essere certo che era UTF-8.

Se il file inizia con un segno di ordine byte UTF-16, è probabile che il resto del testo sia la codifica. Altrimenti, rilevare UTF-16 non è semplice come UTF-8, a meno che non si riesca a rilevare il pattern di coppie surrogate: ma l'uso di coppie surrogate è raro, quindi di solito non funziona. UTF-32 è simile, tranne che non ci sono coppie surrogate da rilevare.

rilevamento regionale

successivo avremmo assumere il lettore era in una determinata regione. Ad esempio, se l'utente vedesse l'interfaccia utente localizzata in giapponese, potremmo quindi tentare di rilevare le tre principali codifiche giapponesi. ISO-2022-JP è di nuovo ad est per rilevare con le sequenze di escape. Se ciò fallisce, determinare la differenza tra EUC-JP e Shift-JIS non è così semplice. È più probabile che un utente possa ricevere il testo di Shift-JIS, ma c'erano caratteri in EUC-JP che non esistevano in Shift-JIS e viceversa, quindi a volte potresti ottenere una buona corrispondenza.

La stessa procedura è stata utilizzata per le codifiche cinesi e altre regioni.

Scelta degli utenti

Se questi non hanno fornito risultati soddisfacenti, l'utente deve scegliere manualmente una codifica.

+0

Presumo che i sistemi di riferimento nei link utilizzare strategie simili a quelle che ho descritto, ma spero che la nostra esperienza sarà utile. –

+3

UTF-32 è molto facile da rilevare, a causa della restrizione sull'intervallo di punti codice. Un'unità di codice UTF-32 valida si adatta sempre al modello 00 {0x | 10} xx xx (per BE) o xx xx {0x | 10} 00 (per LE). – dan04

+0

@JaredOberhaus potresti mostrare qualche codice java sul primo passaggio? inoltre, come troveresti gli elementi del gruppo corretto di codifiche per il secondo passo? –

Problemi correlati