Чарде явно не прав на Big5 - PullRequest
2 голосов
/ 19 января 2011

Я декодирую большую (около гигабайта) базу данных с плоскими файлами, в которой смешаны кодировки символов.Модуль Python chardet до сих пор неплохо справляется с идентификацией кодировок, но если он наткнется на камень преткновения ...

In [428]: badish[-3]
Out[428]: '\t\t\t"Kuzey r\xfczgari" (2007) {(#1.2)}  [Kaz\xc4\xb1m]\n'

In [429]: chardet.detect(badish[-3])
Out[429]: {'confidence': 0.98999999999999999, 'encoding': 'Big5'}

In [430]: unicode(badish[-3], 'Big5')
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)

~/src/imdb/<ipython console> in <module>()

UnicodeDecodeError: 'big5' codec can't decode bytes in position 11-12: illegal multibyte sequence

chardet сообщает об очень высокой уверенности в выборе кодировок,но это не расшифровывает ... Есть ли другие разумные подходы?

1 Ответ

3 голосов
/ 19 января 2011

Точка, которая не может быть подчеркнута слишком сильно: Вы не должны ожидать каких-либо разумных предположений о кодировке для фрагмента текста, который настолько короток и имеет такой высокий процент простых старых символов ASCII.

О big5: chardet создает очень широкую сеть при проверке кодировок CJK. В big5 много неиспользуемых слотов, и chardet не исключает их. Эта строка недопустима big5, как вы узнали. На самом деле это действительно (но бессмысленно) big5_hkscs (который использовал много дыр в big5).

Существует огромное количество однобайтовых кодировок, которые соответствуют строке.

На этом этапе необходимо обратиться за внеполосной помощью. Погуглив "Kuzey и т. Д.", Вытащил турецкий сериал "Kuzey rüzgari", так что теперь у нас есть язык.

Это означает, что если он был введен человеком, знакомым с турецким языком, он может быть в cp1254, или iso_8859_3 (или _9), или mac_turkish. Все они производят бред для слова [Kaz ?? m] в конце. Согласно веб-сайту imdb, это имя персонажа, и это тот же бред, который был получен при декодировании с помощью cp1254 и iso-8859-9 (KazÄ ± m). Декодирование с вашим предложенным iso-8859-2 дает Kazäąm, который тоже выглядит не очень правдоподобно.

Вы можете обобщить это? Я так не думаю: -)

Я бы настоятельно рекомендовал, чтобы в таком случае вы расшифровали его, используя latin1 (чтобы не было искажено ни одного байта), и пометили запись как имеющую неизвестную кодировку. Вы должны также использовать минимальную длину отсечения.

Обновление Для чего стоит, the_two_bytes_in_the_character_name.decode (' utf8 ') выдает U + 0131 LATIN SMAL LETTER DOTLESS I, который используется на турецком и азербайджанском языках. Дальнейшее прибегание к помощи указывает, что Kazım - достаточно распространенное турецкое имя.

...