Connect with us

Обучение

Заметки Python #16: Кодировки

 

Мы переходим к построению клиент-серверного приложения и начнем с самых азов — кодировки в Python

С чего всё начиналось: ASCII

Многие уже знают, что для хранения числовых и текстовых данных в памяти вашего компьютера используются последовательности кодов. Каждая буква записывается как элемент кода в вычислительную память, а при отображении она конвертируется обратно. Очень долгое время, начиная с 60-х годов прошлого века использовался стандарт American Standard Code for Information Interchange или, сокращенно — ASCII. Несмотря на все последующие модификации стандарта, он упёрся в ограничение 256 символов, что, с учетом развития алфавитов многих стран, стало катастрофически мало

ASCII на сегодняшний день используется в крайне редких случаях.

Что такое Unicode?

Unicode — это относительно новый стандарт кодирования, который сейчас повсеместно используется в программировании. Принцип Unicode в диапазоне-последовательности кодовых точек, к которым привязаны определенные символы (буквы, цифры, знаки препинания и т.д.). Кодовое пространство стандарта включает 1 114 112 кодовых точек, находящихся в пределах 0-10FFFF.

Для работы с данными в Unicode принято использовать правило Unicode sandwich — байты из памяти конвертируются в строковый формат (Uncode). Дальше в приложении данные оперируются только в строковом формате. Перед передачей данных мы снова конвертируем строку в байты

Кодировка UTF-8

Чтобы передавать данные по сети нам нужно сконвертировать текст  в байты. Для этого и служит одна из версий Unicode — кодировка UTF-8. Она имеет переменную длину кода — это значит, что UTF-8 не использует один байт все время, это от 1 до 4 байтов.

 

Unicode в Python

Итак, мы определились. Для человека текст — это набор соответствующих символов. Для памяти компьютера — это данные в виде байт. Если это представить через призму языка программирования Python, то мы получим следующее:

  • Тип данных str — это текст, он же неизменяемый набор кодов (code points) Unicode;
  • Тип данных bytes — это данные (байты), это же неизменяемый набор байтов

Строки

Строка — последовательность кодов Unicode. Её можно представить несколькими способами, в т.ч. с помощью имени символа или особого формата. Для того, чтобы какую-либо строку перевести в unicode-формат, можно воспользоваться онлайн-конвертерами. Можно использовать https://www.branah.com/unicode-converter

 

Результат:

Байты

Байты в среде разработки Python —  это тоже последовательность unicode-символов, но, в отличии от строк, представлены в виде ASCII, а это значит, что при работе с кириллицей будет ошибка. Байтовый тип данных в питоне маркируется английской буквой b

 

 

Результат (ошибки нет, т.к. этот участок кода закомментирован):

Конвертация (decode, encode)

Практически все программы так или иначе работают с сетью или файловой системой, поэтому работа с байтами так или иначе необходима. Чтобы преобразовывать байты в строки (bytes -> str) и наоборот (str -> bytes) используются методы кодирования или декодирования.

 

Результат:

Методы encode и decode можно применять к типам данных str и bytes. В качестве аргумента передается имя переменной и ключ шифрования (кодировка, если по-простому).

Файловая система и кодировка

При работе с операциями над файловой системой необходимо обязательно указывать кодировку, так как в различных ОС — она разная.

 

Результат:

Обработка ошибок

У методов encode и decode есть режимы обработки ошибок, которые указывают, как реагировать на ошибку преобразования.При использовании метода encode при возникновении ошибок генерируется исключение UnicodeError. У метода decode тоже есть похожий механизм — генерируется исключение UnicodeDecodeError.

 

Результат:

 

Модуль subprocess

Модуль subprocess отвечает за выполнение следующих действий: порождение новых процессов, соединение c потоками стандартного ввода, стандартного вывода, стандартного вывода сообщений об ошибках и получение кодов возврата от этих процессов. В качестве примера мы используем стандартную команду из cmd  — ping.

В этом примере результат работы модуля subprocess — это конвертация каждой из строк в формат кодировки cp866, после чего результат перекодируется в UTF-8. Он представляет собой набор кодов Unicode (байтовый формат). Для дальнейшей работы с результатом как со строкой необходимо преобразовать его в этот тип, то есть выполнить операцию decode.

Вся последовательность действий:

  1. Байтовый формат cp866 -> строка в формате cp866.
  2. Строка в формате cp866 -> байтовый формат UTF-8.
  3. Байтовый формат UTF-8 -> строка в формате UTF-8.

 

Результат

Click to comment

Leave a Reply

Ваш e-mail не будет опубликован.

Лучшие сервисы стриминга музыки в 2019 году

Сервисы

Wink Ростелеком: Samsung LG, Sony, Phillips, Android TV

Ростелеком

LG WEB OS: приложения, обновления, настройка, проблемы со звуком

Гаджеты

Ноутбуки Asus не видят жесткий диск. Автоматический вход в BIOS при старте

Гаджеты

.

Digital2.ru - тренды, IT, разработка, цифровая экономика

Connect
Подпишись на нас