Быстрый в изучении - мощный в программировании
Скрипт ИНВЕСТОР на Python

Попробуйте себя в качестве инвестора имея в помощники мощный алгоритм советника на Python...

Все уроки по PyQt5

PyQt5 реализован как комплект Python-модулей. Он включает в себя около 620 классов и 6000 функций и методов...

Скрипт отправки SMS через Python

Была задача отправить SMS-ки большому списку номеров телефона с уточнением цены за всю рассылку "До" ее отправки...

Как определить кодировку последовательности байтов в 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-форматах в начале файла может находиться маркер порядка байтов.

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

Оставьте комментарий!

Используйте нормальные имена.

Имя и сайт используются только при регистрации

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

(обязательно)