Как узнать кодировку строки python
Перейти к содержимому

Как узнать кодировку строки python

  • автор:

Модуль chardet в Python, определение кодировки

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

Модуль chardet , это автоматический детектор кодировки текста и является портом кода автоопределения в Mozilla. Этот модуль поможет определить кодировку символов, если вдруг на экране появятся «кракозябры«.

Модуль chardet отлично поддерживает и определяет русские кодировки: KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251(Cyrillic)

Установка модуля chardet в виртуальное окружение.

# создаем виртуальное окружение, если нет $ python3 -m venv .venv --prompt VirtualEnv # активируем виртуальное окружение $ source .venv/bin/activate # ставим модуль chardet (VirtualEnv):~$ python -m pip install -U chardet

Примеры автоматического определения кодировки символов:

Самый простой способ автоматически определить кодировку — это использовать функцию обнаружения detect() модуля chardet .

>>> import urllib.request, chardet >>> rawdata = urllib.request.urlopen('http://yandex.ru/').read() >>> chardet.detect(rawdata) # >>> rawdata = urllib.request.urlopen('https://www.zeit.de/index').read() >>> chardet.detect(rawdata) #

Расширенное использование модуля chardet .

Если имеется большой объем текста/данных, то можно вызывать обнаружение кодировки постепенно. Как только модуль будет достаточно уверен в своих результатах, он остановится.

Для такого поведения необходимо создать объект UniversalDetector(), затем повторно вызывать его метод подачи .feed() с каждым блоком текста. Если созданный детектор достигнет минимального порога достоверности, он установит для Detector.done значение True.

В конце работы детектора необходимо вызвать Detector.close() , который выполнит некоторые окончательные вычисления в случае, если детектор не достиг минимального порога достоверности.

import urllib.request from chardet.universaldetector import UniversalDetector usock = urllib.request.urlopen('https://www.zeit.de/index') # создаем детектор detector = UniversalDetector() for line in usock.readlines(): # скармливаем детектору строки detector.feed(line) if detector.done: # если детектор определил # кодировку, то прерываем цикл break # закрываем детектор detector.close() # закрываем соединение с сайтом usock.close() print(detector.result) #

Пример определения кодировки нескольких файлов.

Для определения кодировки текстовых файлов, их необходимо открывать в режиме чтения байтов: more=’rb’

import glob from chardet.universaldetector import UniversalDetector # создаем детектор detector = UniversalDetector() for filename in glob.glob('*.xml'): print(filename.ljust(60), end='') # сбрасываем детектор # в исходное состояние detector.reset() # проходимся по строкам очередного # файла в режиме 'rb' for line in open(filename, 'rb'): detector.feed(line) if detector.done: break detector.close() print(detector.result) 

Python: Кодировка

На самом глубоком уровне компьютер оперирует исключительно цифрами 0 и 1 . Это так называемый двоичный код, а единички и нули называются битами, от «binary digit» — «двоичная цифра».

Обычные, привычные нам числа в десятичной системе исчисления, закодированы с помощью двоичных чисел:

Но как быть с текстом? Компьютер на самом деле не знает ничего о буквах, знаках пунктуации и прочих текстовых символах. Все эти символы так же закодированы числами.

Можно взять английский алфавит и дать каждой букве число, начиная с единицы по порядку:

В этом заключается суть кодировок.

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

  • hello → 8 5 12 12 15
  • 7 15 15 4 → good

Подобные таблицы, в которых сопоставляются буквы и числа, называются кодировками. Кроме букв алфавита, в таблицы кодировок входят знаки препинания и другие полезные символы. Вы наверняка сталкивались с кодировками, например, ASCII или UTF-8.

Разные кодировки содержат разное количество символов. Изначально небольших таблиц вроде ASCII было достаточно для большинства задач. Но в ней только латинские буквы, несколько простых символов вроде % и ? и специальные управляющие символы типа перевода строки.

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

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

Задание

В Python можно «запросить» и вывести на экран любой символ из кодировки ASCII. Для этого используется функция chr() . Например:

print(chr(63)) 

На экран выведется символ с номером 63 — вопросительный знак ? . Таким способом можно выводить любой символ.

Воспользуйтесь таблицей кодов ASCII. В этой таблице нас интересует десятичный код (dec или decimal), которыми кодируются символы.

Используя пример выше и таблицу, выведите на экран (каждый на своей собственной строке) ~ , ^ и % .

(Конечно, можно «обмануть» тесты и просто сделать print(‘~’) и т.д., но так будет совсем неинтересно 🙂

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

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

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

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

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Полезное

Определения

  • Кодировка — набор символов, закодированных с помощью чисел для представления текста в электронном виде.

Метод str.encode() в Python

Метод encode() строки возвращает закодированную версию данной строки.

Начиная с Python 3.0, строки хранятся как Unicode, т.е. каждый символ в строке представлен кодовой точкой. Итак, каждая строка ‒ это просто последовательность кодовых точек Unicode.

Для эффективного хранения этих строк последовательность кодовых точек преобразуется в набор байтов. Этот процесс известен как кодирование.

Существуют различные кодировки, которые по-разному обрабатывают строку. Популярные кодировки: utf-8, ascii и т. Д.

Используя строковый метод encode(), вы можете преобразовывать не кодированные строки в любые кодировки, поддерживаемые Python. По умолчанию Python использует кодировку utf-8.

string.encode(encoding='UTF-8',errors='strict')

Параметры

По умолчанию метод не требует никаких параметров. Он возвращает версию строки в кодировке utf-8. В случае сбоя возникает исключение UnicodeDecodeError.

Однако он принимает два параметра:

  • кодировка ‒ тип кодировки, в который должна быть закодирована строка;
  • ошибки ‒ ответ при сбое кодирования. Есть шесть типов реакции на ошибку:
    • strict ‒ ответ по умолчанию, который вызывает исключение UnicodeDecodeError при сбое;
    • ignore ‒ игнорирует некодируемый юникод из результата;
    • replace ‒ заменяет некодируемый юникод на вопросительный знак;
    • xmlcharrefreplace ‒ вставляет ссылку на символ XML вместо некодируемого юникода;
    • backslashreplace ‒ вставляет escape-последовательность\uNNNN вместо некодируемого юникода;
    • namereplace ‒ вставляет escape-последовательность\N вместо некодируемого юникода.

    Пример 1: Кодирование в кодировку Utf-8 по умолчанию

    # unicode string string = 'pythön!' # print string print('The string is:', string) # default encoding to utf-8 string_utf = string.encode() # print result print('The encoded version is:', string_utf)
    The string is: pythön! The encoded version is: b'pyth\xc3\xb6n!'

    Пример 2: Кодирование с параметром ошибки

    # unicode string string = 'pythön!' # print string print('The string is:', string) # ignore error print('The encoded version (with ignore) is:', string.encode("ascii", "ignore")) # replace error print('The encoded version (with replace) is:', string.encode("ascii", "replace"))
    The string is: pythön! The encoded version (with ignore) is: b'pythn!' The encoded version (with replace) is: b'pyth?n!'

    Примечание: Попробуйте также другие параметры кодировки и ошибки.

    Определение кодировки и перевод в UTF-8

    Алекс получил от своего друга Никиты из России электронное письмо с вложенным текстовым файлом (не маленьким – точно больше 100Кб) и был удивлен его содержимым. Алекс давно знаком с Никитой и знает, что текст точно на русском языке, что он все пишет в нижнем регистре, и что Никита принципиально не использует никакие кодировки, кроме однобайтовых. Алекс хотел бы определить, какую кодировку Никита использовал (CP866 (DOS), CP1251 (Windows), KOI8R, ISO-8859-5, cp10007(MacOS)), и увидеть первые 2048 символов этого файла в кодировке UTF-8. Воспользуйтесь имеющимися данными, напишите программу, которая будет определять автоматически определять кодировку и выводить первые 2048 символов этого файла в кодировке UTF-8.

    Буду очень благодарен)
    Идей нет совсем

    94731 / 64177 / 26122
    Регистрация: 12.04.2006
    Сообщений: 116,782
    Ответы с готовыми решениями:

    Определение кодировки в строке и преобразование ее в UTF-8
    С помощью этого куска кода я получаю html страницы и записываю как обычную строку в response.

    Перевод из кодировки UTF — 8 в ANSI
    Всем привет! Пишу прогу на линухе, результаты работы вывожу в html файл. Так вот когда открываю.

    Перевод из кодировки UTF-8 в CP866
    Нужно сделать функцию, которая переводит текст из кодировки UTF-8 в CP866. То есть с нуля, так-как.

    Перевод кодировки из utf-8 в windows-1251
    Такая проблема: распарсил некоторый xml файл, у которого в атрибут значится кодировка utf-8. Затем.

    Программа для конвертации тектового файла из кодировки UTF-8 в UTF-16
    Привет. Как можно реализовать эту программу на чистом си?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *