2012-11-27 11 views
10

Piszę aplikację, która pobiera ogromne ilości tekstów jako dane wejściowe, które mogą być w dowolnym kodowaniu znaków, i chcę je zapisać w UTF-8. Nie otrzymam lub nie mogę zaufać kodowaniu znaków, które jest zdefiniowane za pomocą danych (jeśli istnieją).Wykrywanie kodowania w Pythonie, użyj biblioteki chardet czy nie?

Przez jakiś czas używałem chardeta biblioteki Pythons do wykrywania oryginalnego kodowania znaków, http://pypi.python.org/pypi/chardet, ale ostatnio pojawiły się pewne problemy, w których zauważyłem, że nie obsługuje on kodowania skandynawskiego (na przykład iso-8859-1). Poza tym zajmuje dużo czasu/CPU/mem, aby uzyskać wyniki. ~ 40s dla pliku tekstowego o wielkości 2 MB.

Próbowałem tylko przy użyciu standardowego pliku Linux

file -bi name.txt 

I z wszystkich moich plików dotychczas zapewnia mnie z wynikiem 100%. A to z ~ 0.1s dla pliku 2 MB. Obsługuje również skandynawskie kodowanie znaków.

Sądzę, że zalety korzystania z pliku są oczywiste. Jakie są wady? Czy czegoś brakuje?

+0

Jeśli jest w 100% dokładny, to zastanawiam się, dlaczego ktoś go nie zaimplementował (lub "chardet") używając tych samych reguł, których używa 'plik' ... - czy próbowałeś' pliku' kontra 'chardet? 'porównanie ze znaczną ilością danych testowych? –

+0

FWIW, ISO-8859-1 (i jego wersja, -15) to nie tylko skandynawski, jest używany do wielu innych skryptów łacińskich. Jeśli dane wejściowe to "głównie ASCII", a nie UTF-8, to ISO-8859-1 to całkiem niezły domysł. http://en.wikipedia.org/wiki/ISO/IEC_8859#The_Parts_of_ISO.2FIEC_8859 – Thomas

+0

Jon, całkowicie się zgadzam. Stąd moje pytanie. Nie mam dostępu do wystarczającej ilości danych, które sprawiłyby, że to podejście byłoby statystycznie znaczące, więc odpowiedź na Twoje pytanie jest niestety niestety. – Niklas9

Odpowiedz

4

Stare pliki w formacie MS-DOS i Windows mogą być wykrywane jako nieznane-8bit zamiast ISO-8859-X, ze względu na niezupełnie standardowe lokalizacje. Chardet zamiast tego wykona wykształcone domysły, podając wartość pewności.

http://www.faqs.org/faqs/internationalization/iso-8859-1-charset/

Jeżeli nie będzie obsługiwać stare, egzotyczne, out-of-standardowe pliki tekstowe, myślę, że można użyć file -i bez wielu problemów.

+0

Dzięki za odpowiedź, ma sens. Czy masz przykład takiego pliku? Mam na myśli stary format MS-DOS lub Windows. – Niklas9

+0

To może być przykład, który myślę. Jest to stary plik tekstowy z aplikacji MS-DOS, 1988. Plik -i na moim Ubuntu 12.04 wykrywa go jako strumień aplikacji/oktetu; charset = binary. Gdzieś jest niewłaściwa postać. Nie jestem MASTER ENCONDER, ale jeśli otworzysz go za pomocą oktety, zobaczysz wszędzie dane binarne (09 bajtów). Jeśli jest inne wyjaśnienie, daj mi znać, dziękuję. http://filebin.ca/OOQ4WVHhaKT – GendoIkari

2

Znalazłem "chared" (http://code.google.com/p/chared/), aby był całkiem dokładny. Możesz nawet trenować nowe wykrywacze kodowania dla języków, które nie są obsługiwane.

To może być dobra alternatywa, gdy chardet zacznie działać.

+0

Fajnie, dzięki. Wydaje się, że ma jedno dodatkowe wymaganie, ale musisz znać język używany w tekście. Zwykle nie wiem o tym w mojej aplikacji .. Ale zdecydowanie wydaje się być dobrą alternatywą. – Niklas9

+1

Tak, musisz znać język, ale możesz go odgadnąć używając np. Langid (https://github.com/saffsd/langid.py). –

Powiązane problemy