Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Как определить кодировку последовательности байтов в Python

30 октября 2017 г. Archy Просмотров: 32057 RSS 3
Python для начинающих , , , ,
Как определить кодировку последовательности байтов в Python

Как узнать, в какой кодировке записана последовательность байтов? Коротки ответ: никак. Кто-то должен вам сообщить.

В некоторых коммуникационных протоколах и файловых форматах, например HTTP и XML, предусмотрены заголовки, в которых явно указывается, как закодировано содержимое.

Можно быть уверенным, что поток байтов представлен не в кодировке ASCII, если он содержит значения, больше 127, а сам способ построения UTF-8 и UTF-16 исключает определенные последовательности байтов.

Но и с учетом всего этого никогда нет стопроцентной уверенности в том, что некий двоичный файл записан в кодировке ASCII или UTF-8 просто потому, что в нем не встречаются определенные комбинации битов.

Если вы являетесь веб-разработчиком и часто имеете дело с WordPress то наверное не один раз сталкивались с кодировкой UTF-8. Например, любая тема, themeforest WoodMart не исключение, работает полностью с UTF-8.

Однако известно, что в естественных языках есть свои правила и ограничения. Поэтому если допустить, что поток байтов - это простой текст на естественном языке, то его кодировку можно попытаться определить с помощью различных эвристических правил и статистики.

Например, если часто встречается байт b'\x00', то это, скорее всего, 16- или 32-разрядная кодировка, но не 8-разрядная схема, потому что нулевые байты в открытом тексте - очевидная ошибка.

Если часто встречается последовательность b'\x20\x00', то это, наверное, символ пробела(U+0020) в кодировке UTF-16LE, а не малоизвестный символ U+2000 EN QUAD.

Именно так и работает пакет Chardet - универсальный детектор кодировки символов( https://pypi.python.org/pypi/chardet ) - который пытается распознать одну из 30 поддерживаемых кодировок.

Chardet - написанная на Python библиотека, которую вы можете включить в свою программу, а, кроме нее, пакет содержит также командную утилиту chardetect. Вот обычный пример запуска команды chardetect если дать ей имя файла как первый аргумент:

$ chardetect my_python_script.py
my_python_script.py: utf-8 with confidence 0.99

Как же определить кодировку последовательности байтов файла не из командной строки, а использовав модуль chardet?

Используйте следующий пример кода:

import chardet    
neededFile = open("my_python_script.py", 'rb')
rawdata = neededFile.read()
result = chardet.detect(rawdata)
charenc = result['encoding']
neededFile.close() # закрываем файл, освобождаем ресурсы

Хотя в самих двоичных последовательностях закодированного текста обычно нет явных указаний на кодировку, в некоторых UTF-форматах в начале файла может находиться маркер порядка байтов.

Советуем вам следующее видео к просмотру:

Комментариев: 3
  1. помогли спасибо

  2. https://ru.wikipedia.org

    [url=https://ru.wikipedia.org]Текст[/url]

    Текст

  3. Спасибо