2009-04-21 12 views
43

Szukam sposobu wykrywania zestawów znaków w dokumentach. Czytałem realizację wykrywania zestaw znaków Mozilli tutaj:Algorytm wykrywania kodowania znaków

Universal Charset Detection

Mam również implementację Javy tej nazwie jCharDet:

JCharDet

Oba te oparte są na badania przeprowadzone przy użyciu zestawu danych statycznych. Zastanawiam się, czy ktokolwiek użył jakiejkolwiek innej implementacji, a jeśli tak, to co? Czy zastosowałeś własne podejście, a jeśli tak, to jaki algorytm został użyty do wykrycia zestawu znaków?

Każda pomoc zostanie doceniona. Nie szukam na listę istniejących podejść za pośrednictwem Google, ani ja szukam linkiem do artykułu Joel Spolsky - tylko w celu wyjaśnienia:)

UPDATE: zrobiłem kilka badań nad tym i zakończył up znalezienie ramy nazwie cpdetector który używa plug podejście do wykrywania znaków, patrz:

CPDetector

zapewnia to BOM, chardet (Mozilla podejścia) oraz ASCII wykrywania wtyczek. Łatwo też napisać własną. Istnieje również inna struktura, która zapewnia znacznie lepsze wykrywanie znaków, że podejście Mozilla/jchardet etc ...

ICU4J

Jest to dość łatwe do napisania własnej wtyczki dla cpdetector który wykorzystuje te ramy do zapewnienia bardziej dokładny charakter algorytm wykrywania kodowania. Działa lepiej niż podejście Mozilli.

+0

To trudny problem. Dzięki za świetne linki z własnych badań. – erickson

+0

Jest jeden słynny przypadek: http://blogs.msdn.com/oldnewthing/archive/2007/04/17/2158334.aspx – McDowell

+0

Tak, znajdowałem się w notatniku, zmienię swój post dzięki moim badaniom kiedy już skończę, kilka ciekawych rzeczy ... – Jon

Odpowiedz

9

Wiele lat temu mieliśmy wykrywanie zestawu znaków dla aplikacji pocztowej, a my przetworzyliśmy własną. Aplikacja pocztowa była w rzeczywistości aplikacją WAP, a telefon oczekiwał na UTF-8. Było kilka kroków:

Uniwersalne

Możemy łatwo wykryć, czy tekst był UTF-8, jak tam jest nieco specyficzny wzór w najlepszych bitów bajty 2/3/etc. Po stwierdzeniu, że wzorzec został powtórzony określoną liczbę razy, można mieć pewność, że jest to UTF-8.

Jeśli plik zaczyna się od znaku porządku bajtowego w formacie UTF-16, prawdopodobnie można założyć, że reszta tekstu to kodowanie. W przeciwnym razie wykrywanie UTF-16 nie jest tak łatwe jak UTF-8, chyba że można wykryć wzór zastępczych par: ale użycie par zastępczych jest rzadkie, więc zwykle nie działa. UTF-32 jest podobny, z tym wyjątkiem, że nie istnieją żadne pary do rozpoznania.

wykrywanie Regional

Następny będziemy zakładać, czytelnik był w określonym regionie. Na przykład, jeśli użytkownik widział interfejs użytkownika zlokalizowany w języku japońskim, moglibyśmy spróbować wykryć trzy główne kodowania japońskie. ISO-2022-JP znajduje się ponownie na wschód, aby wykryć sekwencje specjalne. Jeśli to się nie powiedzie, ustalenie różnicy między EUC-JP i Shift-JIS nie jest tak proste. Bardziej prawdopodobne jest, że użytkownik otrzyma tekst Shift-JIS, ale w EUC-JP były postacie, które nie istniały w Shift-JIS, i na odwrót, więc czasami można było dobrze dopasować.

Ta sama procedura została użyta w przypadku chińskich kodowań i innych regionów.

wybór użytkownika

Jeżeli nie dawały zadowalających rezultatów, użytkownik musi ręcznie wybrać kodowanie.

+0

Zakładam, że systemy, które polecasz w linkach stosuj podobne strategie do tych, które opisałem, ale mam nadzieję, że podzielenie się naszym doświadczeniem będzie pomocne. –

+3

UTF-32 jest bardzo łatwy do wykrycia ze względu na ograniczenie w zakresie punktu kodowego. Ważna jednostka kodowa UTF-32 zawsze będzie pasować do wzorca 00 {0x | 10} xx xx (dla BE) lub xx xx {0x | 10} 00 (dla LE). – dan04

+0

@ JaredOberhaus Czy mógłbyś pokazać kod Java na temat pierwszego kroku? również, w jaki sposób można znaleźć elementy prawidłowej grupy kodowań do drugiego kroku? –

Powiązane problemy