Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Пример: перенос chardet на Python 3




Пример: перенос chardet на Python 3

Содержание
  • 1 Погружение
  • 2 Что такое автоматическое определение кодировки символов?
    • 2. 1 Разве это возможно?
    • 2. 2 Такой алгоритм существует?
  • 3 Введение в модуль chardet
    • 3. 1 UTF-N с МПБ
    • 3. 2 Экранированные кодировки
    • 3. 3 Многобайтныйе кодировки
    • 3. 4 Однобайтные кодировки
    • 3. 5 windows-1252

Погружение

Вопрос: что является первой причины тарабарщины на страницах интернета, с вашем почтовом ящике, и в любой компьютерной системе когда либо написанной? Это кодировка символов. В главе про строки, я рассказывал о истории кодировок и создании Юникода, " одной кодировки правящей всеми". Я бы полюбил ее если бы никогда больше не видел тарабарщины в вебе, потому что все системы сохраняют верную информацию о кодировке, все протоколы передачи данных поддерживают Юникод, и каждая система работы с текстом придерживалась идеальной верности когда конвертировала из одной кодировки в другую.

Еще я люблю пони.

Пони юникода.

Юникодопони, так сказать.

Я остановлюсь на автоматическом определении кодировки символов.

Что такое автоматическое определение кодировки символов?

Это значит взять последовательность байт в неизвестной кодировке, и попытаться определить кодировку так чтобы вы могли читать текст. Это как взломать когда когда у вас нет ключа для расшифровки.

Разве это возможно?

Вообще, да. Однако, некоторые кодировки оптимизированны для конктерных языков, и языки не случайны. Некоторые последовательности символов встречаются постоянно, когда другие очень редки. Человек спокойно говорящий по английски открывая газету и найдя там “txzqJv 2! dasd0a QqdKjvz” сразу определит что это не английский(даже если состоит полностью из английских букв). При помощи изучения большого количества " обычного" текста, компьютерный алгоритм может имитировать знание языка и обучиться делать предположения о языке текста.

Другими словами, определение кодировки это на самом деле определение языка, объедененное со знанием какой язык использовать с какой кодировкой.

Такой алгоритм существует?

Черт побери да! Все основные браузеры имеют встроенное автоопределение кодировки, поскольку интернет полон страниц на которых кодировка вообще не указана. Mozilla Firefox включает библиотеку автоопределения кодировки симоволов с открытым исходным кодом. Я портировал ее на Python2 и продублировал в модуле chardet. Эта глава покажет вам пошагово весь процесс переноса модуля chardet с Python 2 до Python 3.

Введение в модуль chardet

Прежде чем начать переносить код, я помогу вам понять как этот код работает! Это краткий инструктаж по навигации в исходном коде. Библиотека chardet слишком болшьшая чтобы включать ее здесь полностью, но вы пожете скачать ее с chardet. feedparser. org.

Точкой входа алгоритма определения является universaldetector. py, в котором есть один класс UniversalDetector. (Вы могли подумать что точка входа это функция detect в chardet/__init__. py, но на самом деле это просто удобная функция которая создает объект UniversalDetector, вызывает его, и возвращает его результат)

Вот пять категорий кодировок которые поддерживает UniversalDetector:

  • UTF-N с меткой порядка байт(МПБ). Это включает в себя UTF-8, оба большой-индийский и малый-индийский вариант UTF-16, и все 4 варианта UTF-32 зависящих от порядка байт.
  • Экранированные последовательности, которые полностью совместимы с 7-битным ASCII, где символы не входящие в семибитную кодировку ASCII начинаются с символа экранирования. Например: ISO-2022-JP(Японская) и HZ-GB-2312(Китайская)
  • Многобайтовые кодировки, где каждый символ представлен различным количеством байт. Например: BIG5(Китайская), SHIFT_JIS(Японская), и TIS-620(Тайская)
  • Однобайтовые кодировки, где каждый символ представлен одним байтом. Нарпимер: KOI8-R(Русская), WINDOWS-1266(Иврит), и TIS-620(Тайская)
  • WINDOWS-1252, которая в основном используется в Microsoft Windows менеджерами среднего звена которые не хотят задумываться о кодировке символов сидя в своей норе.

UTF-N с МПБ

Если текст начинается с МПБ, мы можем разумно заключить что текст закодирован при помощи кодировки UTF-8, UTF-16, или UTF-32. (МБП расскажет нам какой именно; именно для этого она и служит. ) Это поддерживается в UniversalDetector, который вернет результат сразу без каких-либо дальнейших изысканий.

Экранированные кодировки

Если текст содержит распознаваемую экранированную последовательность то это может быть индикатором экранированной кодировки, UniversalDetector создаст EscCharSetProber(определенный в escprober. py) и отдаст текст на обработку.

EscCharSetProber создаст ряд конечных автоматов, основанных на моделях HZ-GB-2312, ISO-2022-CN, ISO-2022-JP, и ISO-2022-KR (определенных в escsm. py). EscCharSetProber пропустит текст через каждый конечный автомат, побайтово. Если только один из автоматов даст положительный результат проверки, EscCharSetProber незамедлительно вернет его в UniversalDetector, который, в свою очередь, отдаст его вызвавшему его процессу. Если любой из конечных автоматов наткнется на недопустимую последовательность, он останавливается и далее продолжается обработка при помощи другого конечного автомата.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...