Как определить кодировку последовательности байтов в Python
Python для начинающих ascii, chardet, chardetect, utf-8, байты в Pyhon
Как узнать, в какой кодировке записана последовательность байтов? Коротки ответ: никак. Кто-то должен вам сообщить.
В некоторых коммуникационных протоколах и файловых форматах, например 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-форматах в начале файла может находиться маркер порядка байтов.
Советуем вам следующее видео к просмотру:
- Методы для работы со словарями в Python
- Модуль shelve в Python - сохранение объектов в файл
- Создание функции Python
- Как определить мощности виртуального сервера для своего проекта?
- Python работа с FTP - Модуль ftplib
- Современные альтернативы функциям map, filter и reduce в Python
- Первые шаги в wxPython [Урок №2]
помогли спасибо
https://ru.wikipedia.org
[url=https://ru.wikipedia.org]Текст[/url]
Текст
Спасибо