код символа unicode python

/привет/мир/etc

Непериодические заметки о программировании

четверг, 10 июля 2014 г.

Строки символов Unicode в Python 2 и Python 3

Винсент: Знаешь, что самое забавное в Европе?
Джулс: Что?
Винсент: Такие маленькие отличия. Там вроде все то же самое, что и здесь, но чуть-чуть отличается.

Как известно, ключевым отличием Python 3.x от Python 2.x является переориентация языка и стандартных библиотек со строк байтов на строки символов Unicode. Когда я решил повнимательнее посмотреть на это различие, пришлось копнуть вглубь и вширь, а результаты моих раскопок я оформил в статью, которую предлагаю вашему вниманию.

Мои эксперименты я ставлю под ОС Windows 7 в стандартной консоли.

Для разминки, несколько манипуляций со строковыми литералами и переменными в Python 2:

Теперь посмотрим на кодировки, используемые в Python 2 и Python 3 по умолчанию:

Кодировки в Python 2:

Кодировки в Python 3:

Вооружившись знанием об используемых по умолчанию кодировках, попробуем в интерактивном режиме Pyhton вводить и выводить строки, включающие нелатинские символы.

Фрагмент интерактивного сеанса Python 2:

Что я только что сделал?

В Python 3 получим такой результат (предлагаю интерпретировать его самостоятельно):

Файл hello.py в кодировке UTF-8 для Python 2:

Выполню его в консоли Windows:

Файл hello3.py в кодировке UTF-8 для Python 3:

Выполню его в консоли Windows:

Следующий скрипт helloname.py демонстрирует ввод и вывод кириллических символов в Python 2, используя для их хранения строки unicode :

Выполню скрипт в консоли Windows:

Посмотрим теперь, что происходит при записи строк символов Unicode в файл. Если в Python 2 явно не преобразовывать выводимые в файл строки unicode в строки str с нужной кодировкой, то получим ошибку.

Выполню скрипт в консоли Windows:

Во избежание ошибок, при записи строк unicode в файл нужно явно приводить их к желаемой кодировке:

Выполню исправленный скрипт в консоли Windows:

Аналогичный эксперимент с Python 3 показывает, что строки пишутся в файл в кодировке, определяемой локалью пользователя!

Выполняю скрипт в консоли Windows:

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

Выполняю скрипт в консоли Windows:

Кодировка cp1251 не кодирует кандзи!

Хорошая новость в том, что в Python 3, в отличие от Python 2, при открытии файла можно явно указать кодировку файла. В эту кодировку и будут преобразовываться строки str при записи в файл; из этой кодировки будут преобразовываться в str читаемые из файла строки байтов.

Укажу явно кодировку открываемых файлов в скрипте hello32.py :

Выполняю скрипт в консоли Windows:

Сопровождать такой код и вносить в него изменения интернациональной команде разработчиков будет проблематично!

Проделанные сравнительные эксперименты не дали мне достаточно оснований, чтобы решительно встать на одну из сторон в священной войне между защитниками Python 2 и энтузиастами Python 3 :). Хотя Unicode-ориентированность Python 3 и то, как это сказывается на прикладном программировании, мне нравится.

Источник

Unicode В Python – Модуль unicodedata Объяснен

Эй, ребята! В этом уроке мы узнаем о Юникоде в Python и свойствах символов Юникода. Итак, давайте начнем.

Эй, ребята! В этом уроке мы узнаем о Юникоде в Python и свойствах символов Юникода. Итак, давайте начнем.

Что такое Юникод?

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

Кодовая точка-это целочисленное значение в диапазоне от 0 до 0x10FFFF в шестнадцатеричном кодировании.

Чтобы начать использовать символы Юникода в Python, нам нужно понять, как модуль string интерпретирует символы.

Как интерпретировать ASCII и Unicode в Python?

Аналогично, odr ()-это встроенная функция, которая принимает односимвольную строку Юникода в качестве входных данных и возвращает значение кодовой точки.

Что означает кодировка символов в Python?

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

Существует множество кодировок,таких как UTF-8,UTF-16, ASCII и т. Д.

По умолчанию Python использует кодировку UTF-8.

Что такое кодировка UTF-8?

Он заменил ASCII (американский стандартный код Для обмена информацией), поскольку он содержит больше символов и может использоваться для разных языков по всему миру, в отличие от ASCII, который ограничен только латинскими языками.

Первые 128 кодовых точек в наборе символов UTF-8 также являются допустимыми символами ASCII. Символ в UTF-8 может иметь длину от 1 до 4 байт.

Кодирование символов в UTF-8 с помощью функции Python encode()

Метод encode() преобразует любой символ из одной кодировки в другую. Синтаксис функции кодирования выглядит следующим образом –

Параметры :

Как использовать Unicode в Python с функцией encode ()?

Теперь давайте перейдем к пониманию того, как функция кодирования строк может позволить нам создавать строки unicode в Python.

Источник

Кодировки и шифрование¶

Кодировки¶

Наиболее распространённые кодировки

Обозначение в python

Латинские буквы, цифры и простые символы

Кириллическая кодировка (русский и другие языки)

Кодировка для русского языка

Unicode — стандарт кодирования символов, включающий в себя знаки почти всех письменных языков мира. В настоящее время стандарт является преобладающим в Интернете.

стандарт включает более 138 тысяч символов;

каждый символ имеет определённое название и код (номер);

Примеры кодов, имен и соответствующих символов:

Конвертация данных между байтам и строками¶

Данные по сети передаются, как правило, в байтах. Например, метод socket.recv() получает данные в байтах. Чтобы преобразовывать данные из байт в строки и наоборот используются специальные методы:

В коде будет выглядеть так:

При работе с кодировкой важно помнить:

Если вы кодируете строку в байты кодировкой UTF-8, то и перекодировать её из байт нужно этой же кодировкой. Некоторые кодировки совместимы, но в большинстве случаев, нарушения этого правила ведёт к потере данных.

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

Шифрование¶

Шифр Цезаря

Шифр Цезаря — это вид шифра подстановки, в котором каждый символ в открытом тексте заменяется символом, находящимся на некотором постоянном числе позиций левее или правее него в алфавите. Например, в шифре со сдвигом вправо на 3, A была бы заменена на D, B станет E, и так далее.

Повторить шифр можно в занятии

Формула для кодирования символа:

Шифр пар

Алфавит случайным образом записывают в 2 строки, и шифрование текста происходит заменой буквы на соседнюю ей по вертикали. Например:

Шифр Виженера

На алфавите длиной N вводят операцию добавления (циклического сдвига) букв. Пронумеровав буквы, добавляем их по модулю N (для англ. алфавита N=26).

Выбираем слово-ключ (пускай pass) и подписываем его под сообщением сколько нужно раз:

Задания¶

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

2. Напишите функцию для шифрования файла шифром Цезаря. Расшифруйте:

3. Напишите функцию для шифрования файла шифром пар. Расшифруйте:

4.* Напишите функцию для шифрования файла шифром Виженера. Расшифруйте. 5. Добавьте в чат (с кодировкой) возможность выполнять шифрование и дешифрование сообщения одним из шифров по выбору пользователя. 6. Доработайте чат таким образом, чтобы пользователь отправлял серверу имя зашифрованного файла и шифр, а сервер дешифровал его и отправлял содержимое файла обратно пользователю.

Источник

Магия Python

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

понедельник, 7 декабря 2015 г.

Кодировки, юникод; Работа с кодировками и юникодом в Python

Кодировки (общее)

Я рекомендую вдумчиво изучить материалы по данным ссылкам, Т.К. Всех начинающих программистов, работа с кодировками, нередко вводит в ступор.

Естественно, я попробую привести сдесь упрощенную модель понимания кодировок. Эта модель будет абстрактной и условной, но она нацелена больше на понимание основ кодирования текста, а не на подробный разбор темы кодировок.

Для начала, нам необходимо помнить то, что компьютер не умеет хранить в себе буквы, он умеет хранить двоичный код, который состоит из 0 и 1. При помощи нулей и единиц, наши тексты зашифрованы в памяти компьютера. Вот тут и вступает в дело то, что мы называем кодировкой.

Давайте договоримся, условно, что код 0101, отвечает за русскую букву «а», а код 0011, за букву «б». Да простят меня за такое читающие сие. Теперь представим 3 разных кодировки. Скажем cp1251, koi8-r и cp866. Я там сказал, что какие-то коды отвечают за буквы? Давайте уточним, в кодировке cp1251, код 0101, отвечает за букву «а», а код 0011, за букву «б» и у нас в тексте записано слово «баба» двоичным кодом. Тоесть, когда мы будем использовать кодировку cp1251 и нам встретится слово в двоичном коде вида «0011 0101 0011 0101», кодировка по этим кодам, преобразует нам эти коды в слово с букв «баба». Все хорошо, но продолжим.

Скажем, что в кодировке koi8-r, кодам 0101 и 0011, соответствуют буквы «ю» и «я». Что произойдет, если мы попробуем прочесть этоже слово «0011 0101 0011 0101», при помощи кодировки koi8-r? Мы получим слово из букв «яюяю».

Допустим, что кодировка cp866, содержит в себе соответствие кодам «0101» и «0011», для букв «у» и «х». Если мы попробуем прочесть слово записанное двоичным кодом вида «0011 0101 0011 0101» при помощи кодировки cp866, мы получим слово «хуху».

Немножко проясняется? То, что мы назваем кодировкой, всего лишь таблица, где хранятся условные двоичные коды и символы(буквы), которые соответствуют этим кодам в конкретной кодировке. Историю о том, почему так получилось, читаем все по тем же ссылкам, которые я давал выше.

Какой мы можем сделать общий вывод? Если у нас будет текст, который будет содержать себе буквы в двоичном коде и будет предназначен для прочтения кодировкой cp1251, а мы попробуем прочесть его при помощи другой кодировки, мы получим совершенно нечитаемый и неправильный набор букв. Также помним про то, что далеко не все кодировки содержат в себе русские буквы. Кпримеру кодировка ascii русских букв не имеет вовсе, да что там, очень мало кодировок, которые содержат в себе русские символы. И при попытке прочесть текст, который закодирован cp1251 при помощи какой-то индусской кодировки, мы получим айсуконфлексы, юсуконфлексы и другие нечитаемые псевдографические умляуты.

Раскодируем букву «а» с cp1251 в юникод и закодируем в cp866.

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

Мы можем раскодировать текст с какой-то кодировки в универсальный юникод, где каждый символ будет иметь индивидуальное обозначение.

Мы можем закодировать текст из юникода в необходимую нам кодировку.

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

Юникод и кодировки в Python

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

Нам необходимо запомнить, что все, что происходит в консоли, происходит в кодировке cp866. Это актуально для Windows. При использовании Linux и MacOS, консоль будет в кодировке utf-8. Определенные шаги, которые мы будем совершать с кодировками в Python, будут актуальны для Windows и неактуальны для других систем, и наоборот.

При создании файла, в котором мы будем писать код нашей программы, первой строкой мы вписываем следующее:

Это сообщит Python, что содержимое файла, хранится в кодировке utf-8. Никогда не пренебрегайте этой строкой, она очень важна!

Дальнейшие пляски вокруг создания юникодовых литералов и кодирования/декодирования ввода и вывода данных в консоли, будут актуальны для OS Windows. Консоль MacOs и Linux используют кодировку utf-8, что позволяет работать с русским текстом без кодирования/декодирования строк. Правда, что в некоторых случаях при разнообразных настройках OS Linux (Чаще) и в MacOs (реже), мы можем получать неожиданные результаты работы с кодировками. В случаях совсем уж непонятных результатов, мы методом тыка пытаемся определить, что же не так, а еще лучше гуглим на тему кодировок в необходимой OS, а также кодировок в определенной OS при программировании на Python.

Для начала, мы поговорим о юникоде в Python. Текст в юникоде имеет свой тип данных «unicode». Создать юникодовый литерал(строку), можно несколькими способами.

Во-первых, мы можем указать модификатор «u» перед кавычками литерала «» или »:

Как видим, при попытке вывести русскую букву без использования оператора print, оканчивается выводом некой символьной записи этой буквы, но если мы воспользуемся оператором print, все будет нормально:

В теории, если мы создадим юникодовый литерал, через print, мы должны получить нормальный читаемый текст, но как показала практика, в каких-то случаях юникодовый литерал, даже при использовании оператора print, вылазит курказябрами. Опять таки, в теории все, у кого консоль находится в utf-8, могут вовсе не забивать себе голову использованием всего богатства кодирований/декодирований для ввода и вывода данных в консоли. Для теста, как оно работать будет, выполните следующее (Актуально для MacOs и Linux):

В теории должно выйти на экран читаемым текстом.

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

Посути, мы ввели текст в utf-8 и декодировали его в unicode, Т.Е. Практически повторили предыдущий эксперимент, но тут мы дали строку в utf-8 и явно декодировали ее в unicode.

Тут мы создали юникодовый литерал и явно преобразовали его в utf-8. Скорее всего, русский текст будет выводиться хорошо и без юникодового литерала и разных там кодирований/декодирований. Но также юникодовый литерал, должен правильно выводиться при использовании оператора print.

Еще один способ создания юникодового литерала, заключается в использовании функции преобразования типов unicode(), где первым аргументом мы передаем строчный литерал, а вторым указываем его текущую кодировку. На выходе получим юникодовый литерал:

>>> a = unicode(‘Привет’, ‘cp866’)

Методы кодирования/декодирования

Для объекта строки и юникода, есть существуют методы, позволяющие кодировать и декодировать данные. Метод decode() для строчного литерала, позволит декодировать его из текущей кодировки в юникод, создав тем самым объект unicode.

Метод encode(), позволяет закодировать юникодовый литерал в строчный, явно указав необходимую кодировку.

Источник

Исчерпывающее руководство по Юникоду и кодировке символов в Python

код символа unicode python. Oblozhka. код символа unicode python фото. код символа unicode python-Oblozhka. картинка код символа unicode python. картинка Oblozhka. Непериодические заметки о программировании

Вводная часть статьи даст общее понимание работы с Юникодом, не привязанное к какому-то определённому языку, однако практические примеры будут приведены именно на Python, а их описание будет довольно лаконичным.

Изучив эту статью, вы:

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

Прим. Статья ориентирована на Python 3, а все примеры кода созданы с помощью оболочки CPython 3.7.2. Большая часть более ранних версий Python 3 также будут корректно обрабатывать код. Если вы всё ещё используете Python 2 и различия в обработке текста и бинарных данных между 2 и 3 версиями языка вас отпугивают, это руководство может помочь вам преодолеть барьер.

Что такое кодировка символов?

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

Она охватывает следующее:

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

На самом высоком уровне — это способ перевода символов (таких как буквы, знаки пунктуации, служебные знаки, пробелы и контрольные символы) в целые числа и затем непосредственно в биты. Каждый символ может быть закодирован уникальным двоичным кодом. Если вы плохо знакомы с концепцией битов, не волнуйтесь, мы вскоре о ней поговорим.

Группы символов выделяют в отдельные категории. Каждому символу соответствует кодовая точка, которую можно рассматривать просто как целое число. В таблице ASCII символы сегментированы следующим образом:

Диапазон кодовых точекКласс
от 0 до 31Контрольные и неотображаемые символы
от 32 до 64Знаки пунктуации, символы, числа и пробел
от 65 до 90Буквы английского алфавита в верхнем регистре
от 91 до 96Дополнительные графемы, такие как [ и \
от 97 до 122Буквы английского алфавита в нижнем регистре
от 123 до 126Дополнительные графемы, такие как < и |
127Контрольный неотображаемый символ ( DEL )

Всего кодировка ASCII содержит 128 символов. В таблице ниже вы видите исчерпывающий набор знаков, которые позволяет отобразить эта кодировка. Если вы не видите какого-то символа, значит вы просто не сможете его вывести с помощью ASCII.

Кодовая точкаСимвол (имя)Кодовая точкаСимвол (имя)
0NUL (Null)64@
1SOH (Start of Heading)65A
2STX (Start of Text)66B
3ETX (End of Text)67C
4EOT (End of Transmission)68D
5ENQ (Enquiry)69E
6ACK (Acknowledgment)70F
7BEL (Bell)71G
8BS (Backspace)72H
9HT (Horizontal Tab)73I
10LF (Line Feed)74J
11VT (Vertical Tab)75K
12FF (Form Feed)76L
13CR (Carriage Return)77M
14SO (Shift Out)78N
15SI (Shift In)79O
16DLE (Data Link Escape)80P
17DC1 (Device Control 1)81Q
18DC2 (Device Control 2)82R
19DC3 (Device Control 3)83S
20DC4 (Device Control 4)84T
21NAK (Negative Acknowledgment)85U
22SYN (Synchronous Idle)86V
23ETB (End of Transmission Block)87W
24CAN (Cancel)88X
25EM (End of Medium)89Y
26SUB (Substitute)90Z
27ESC (Escape)91[
28FS (File Separator)92\
29GS (Group Separator)93]
30RS (Record Separator)94^
31US (Unit Separator)95_
32SP (Space)96`
33!97a
34«98b
35#99c
36$100d
37%101e
38&102f
39103g
40(104h
41)105i
42*106j
43+107k
44,108l
45109m
46.110n
47/111o
480112p
491113q
502114r
513115s
524116t
535117u
546118v
557119w
568120x
579121y
58:122z
59;123 <
60124|
61=125>
62>126
63?127DEL (delete)

Модуль string

Модуль string — простой и удобный инструмент, разграничивающий содержащиеся в ASCII символы по группам, разделяя их в строки-константы. Вот как выглядит основная часть модуля:

Мы можем использовать определённые в модуле константы для рутинных операций:

Что такое биты

Настало время вспомнить, что такое бит, базовая единица информации, которой оперируют вычислительные устройства.

Бит — это сигнал, который имеет два возможных состояния. Есть различные способы символического отображения этих состояний:

Таблица ASCII из предыдущего раздела использует то, что обычно назвали бы числами (от 0 до 127), однако для наших целей важно понимать, что это десятичные числа (с основанием 10).

Каждое из этих десятичных чисел можно выразить последовательностью бит (числом с основанием 2). Вот таблица соотношения двоичных и десятичных чисел:

ДесятичноеДвоичное (кратко)Двоичное (в байте)
0000000000
1100000001
21000000010
31100000011
410000000100
510100000101
611000000110
711100000111
8100000001000
9100100001001
10101000001010

Обратите внимание, что при увеличении десятичного числа n для его отображения (а следовательно и для отображения символа, относящегося к этому числу) требуется всё больше значимых бит.

Вот удобный метод представить строки ASCII как последовательность бит. Каждый символ из строки ASCII переводится в последовательность из 8 нолей и единиц с пробелами между этими последовательностями:

Строковой литерал f-string f»» использует мини-язык форматирования Format Specification Mini-Language, а именно его возможность замещения полей при форматировании строк.

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

Нам нужно больше бит

Исходя из определения бита, можно вывести следующую закономерность: при определённом количестве бит n с их помощью можно выразить 2 n разных значений.

Вот что это означает:

В качестве естественного вывода из приведённой выше формулы мы можем установить следующее: для того, чтобы вычислить количество бит, необходимых для выражения определённого числа разных значений, нам нужно найти n в уравнении 2 n =x, где переменная x известна.

Вот как можно это рассчитать:

Округление вверх в методе n_bits_required() требуется для расчёта значений, которые не являются чистой степенью двойки. К примеру, вам нужно сохранить набор из 110 различных символов. Для этого потребуется log(110) / log(2) == 6.781 бит, но поскольку бит для вычислительной техники является мельчайшей неделимой величиной, для отображения 110 различных значений нам понадобится 7 бит, при этом несколько значений останутся невостребованными.

Всё сказанное служит для обоснования одной идеи: ASCII, строго говоря, семибитная кодировка. Эта таблица содержит 128 кодовых точек, и, соответственно, символов, от 0 до 127 включительно. Это требует 7 бит:

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

Прим. В этой статье под байтом подразумевается группа из 8 бит, как повелось с 60-х годов прошлого века. Если вам не по душе это новомодное название, можете называть их октетами.

То, что ASCII-таблица использует 7 бит из доступных 8, означает, что память вычислительного устройства, занятого строками символов ASCII, наполовину пуста. Для того, чтобы лучше понять, почему это происходит, вернитесь к приведённой выше таблице соответствия двоичных и десятичных чисел. Вы можете выразить числа 0 и 1 с помощью 1 бита, или вы можете использовать 8 бит, чтобы выразить их как 00000000 и 00000001 соответственно.

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

Вы можете выразить числа от 0 до 3 всего двумя битами, от 00 до 11, или использовать 8 бит, чтобы выразить их как 00000000, 00000001, 00000010 и 00000011. Самая большая кодовая точка ASCII, 127, требует только 7 значимых бит.

С учётом этого взгляните, как метод make_bitseq() преобразует строки ASCII в строки, состоящие из байт, где каждый символ требует один байт:

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

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

Со временем появилась одна большая схема кодировки, которая объединила их. Однако, прежде чем мы до этого доберёмся, поговорим немного о краеугольных камнях схем кодировки символов — системах счисления.

Изучаем основы: другие системы счисления

В ASCII-таблице, как мы увидели, каждый символ соответствует числу от 0 до 127.

Этот диапазон чисел выражен в десятичной системе счисления. Именно эту систему используют для счёта люди, просто потому что на руках у нас по 10 пальцев.

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

Вопрос, какое число записано в строке «11» покажется странным, ведь для большинства очевидно, что это одиннадцать.

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

Что же мы подразумеваем, говоря что определённая система счисления имеет основу N?

Один из способов объяснения разных систем счисления заключается в том, чтобы представить, что у вас N пальцев.

Если же вам требуется более подробное объяснение систем счисления, обратитесь к книге Чарльза Петцольда «Код». В этой книге детально объясняются основы работы вычислительной техники.

Чаще в Python для обозначения того, что целое число представлено в системе счисления, отличной от десятичной, используют префиксы-литералы. Для каждой из трёх альтернативных систем существует свой литерал.

Тип литералаПрефиксПример
НетНет11
Binary literal0b или 0B0b11
Octal literal0o или 0O0o11
Hex literal0x или 0X0x11
ДесятичныеДвоичныеВосмеричныеШестнадцатеричные
00b00o00x0
10b10o10x1
20b100o20x2
30b110o30x3
40b1000o40x4
50b1010o50x5
60b1100o60x6
70b1110o70x7
80b10000o100x8
90b10010o110x9
100b10100o120xa
110b10110o130xb
120b11000o140xc
130b11010o150xd
140b11100o160xe
150b11110o170xf
160b100000o200x10
170b100010o210x11
180b100100o220x12
190b100110o230x13
200b101000o240x14

Кстати, вы можете сами убедиться, что подобные способы записи чисел очень часто используется в Стандартной Библиотеке Python. Найдите папку lib/python3.7/ в своей системе, перейдите в неё и введите команду:

Введение в Юникод

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

Юникод служит тем же целям, что и ASCII, но содержит намного больший набор кодовых точек. В период времени между появлением ASCII и принятием Юникода использовалось ещё несколько различных кодировок, но рассматривать их подробно нет смысла, так как Юникод и одна из его схем, UTF-8, в настоящее время стали использоваться практически повсеместно.

Вы можете представить Юникод как расширенную версию ASCII-таблицы — с 1 114 112 возможными кодовыми точками, от 0 до 1 114 111. Это 17*(2 16 ) или 0x10ffff в шестнадцатеричном представлении. Фактически, ASCII является частью Юникода, так как первые 128 символов этих кодировок полностью совпадают.

Юникод содержит практически любой символ, который только можно представить, включая дополнительные непечатаемые. Например, кодовая точка 8207 соответствует отметке RTL, которая используется для смены направления письма. Она полезна в текстах, где абзацы на одном из европейских языков соседствуют с абзацами на арабских языках.

Прим. Кстати, если уж мы хотим быть совсем точны в деталях, то надо отметить ещё один факт. Исторически сложилось, что в Юникоде доступны только 1 111 998 кодовых точек.

Юникод и UTF-8

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

Ранее мы упоминали, что Юникод сам по себе не является кодировкой. И вот почему.

Юникод не содержит указаний по извлечению из текста бит, он работает только с кодовыми точками. В нём нет стандарта конверсии текста в двоичные данные и обратно.

Юникод является абстрактным стандартом кодировки. Для практического его применения чаще всего используют схему UTF-8. Стандарт Юникод (таблица соответствий символов кодовыми точкам) определяет несколько различных кодировок на основе единого набора символов.

Как и менее распространённые UTF-16 и UTF-32, UTF-8 — формат кодировки для отображения символов Юникода в двоичном виде, используя один или несколько байт на один символ. UTF-16 и UTF-32 мы обсудим чуть позже, но пока нам интересен UTF-8 как самый популярный формат.

Сначала требуется разобрать термины «‎‎кодирование»‎ и «‎декодирование»‎.

Кодирование и декодирование в Python 3

Тип данных str в Python 3 рассчитан на представление текста в удобном для чтения формате и может содержать любые символы Юникода.

Кодирование и декодирование — это процесс перехода данных из одной формы в другую.

код символа unicode python. encode decode. код символа unicode python фото. код символа unicode python-encode decode. картинка код символа unicode python. картинка encode decode. Непериодические заметки о программировании

Таким образом символ ñ требует два байта для бинарного представления с помощью UTF-8.

Python 3: всё на Юникоде

Python 3 полностью реализован на Юникоде, а точнее на UTF-8. Вот что это означает:

Мы делаем упор на эти моменты, чтобы вы вдруг не подумали, что кодировка UTF-8 является универсальной. Она действительно широко распространена, но вы вполне можете столкнуться и с другими вариантами. Не будет лишним предусмотреть это в коде.

Один байт, два байта, три байта, четыре…

Одна из важнейших особенностей UTF-8 состоит в том, что это кодировка с переменным размером.

Вспомните раздел, посвящённый ASCII. Любой символ в этой таблице требует максимум одного байта пространства. Это можно быстро проверить с помощью следующего генератора:

С UTF-8 дела обстоят по-другому. Символы Юникода могут занимать от одного до четырёх байт. Вот пример четырёхбайтного символа:

Это небольшая, но важная особенность метода len() :

Таблица ниже показывает, сколько байт занимают основные типы символов.

*Такие как английский, арабский, греческий, ирландский.
**Масса языков и символов, в основном китайский, японский и корейский с разделением по томам (а также ASCII и латиница).
***Дополнительные символы китайского, японского, корейского и вьетнамского, а также другие символы и эмоджи.

Прим. У UTF-8 есть и другие технические особенности. Те, кто работает на Python, редко с ними сталкиваются, поэтому мы не будем раскрывать их в этой статье, но упомянем вкратце, чтобы сохранить полноту картины. Так, UTF-8 использует коды-префиксы, указывающие на количество байт в последовательности. Такой приём позволяет декодеру группировать байты в условиях кодировки с переменным размером. Количество байт в последовательности определяется первым её байтом. Другие технические подробности можно найти на странице Википедии, посвящённой UTF-8 или на официальном сайте.

Особенности UTF-16 и UTF-32

Рассмотрим альтернативные кодировки, UTF-16 и UTF-32. Различие между ними и UTF-8 в основном практическое. Продемонстрируем величину расхождения с помощью перевода туда и обратно:

В данном случае, когда мы кодируем четыре буквы греческого алфавита в двоичные данные с помощью UTF-8, а декодируем обратно в текст с использованием UTF-16, на выходе получается строка с совершенно другими символами (из корейского алфавита).

Так происходит, если для кодирования и декодирования применяют разные кодировки. Два варианта декодирования одного бинарного объекта могут вернуть текст даже на другом языке.

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

КодировкаБайт на символ (включительно)Варьируемая длина
UTF-8От 1 до 4Да
UTF-16От 2 до 4Да
UTF-324Нет

Любопытный аспект семейства UTF: UTF-8 не всегда занимает меньше памяти, чем UTF-16. Хотя с точки зрения математики это выглядит маловероятным, однако это возможно:

Так получается из-за того, что кодовые точки в диапазоне от U+0800 до U+FFFF (от 2048 до 65535 в десятичной системе) в кодировке UTF-8 занимают три байта, а в UTF-16 только два.

Это не означает, что нужно работать с UTF-16, независимо от того, насколько часто вы работаете с символами в этом диапазоне. Один из самых важных поводов придерживаться UTF-8 — в мире кодировок лучше держаться вместе с большинством.

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

Прим. перев. Есть и более весомые причины использовать UTF-8. Среди них её обратная совместимость с ASCII, а также то, что это самосинхронизирующаяся кодировка.

Python и встроенные функции

Вы освоили самую сложную часть статьи. Теперь посмотрим, как всё изученное реализуется на Python.

В Python есть несколько встроенных функций, каким-либо образом относящихся к системам счисления и кодировке:

Логически их можно сгруппировать по назначению.

В таблице ниже эти функции разобраны более подробно:

ФункцияФормаТип аргументовТип возвращаемых данныхНазначение
ascii()ascii(obj)РазличныйstrПредставление объекта символами ASCII. Не входящие в таблицу символы экранируются
bin()bin(number)number: intstrБинарное представление целого чиста с префиксом «0b»
bytes()bytes(последовательность_целых_чисел)

bytes([i])РазличныйbytesПриводит аргумент к двоичным данным, типу byteschr()chr(i)i: int

istrПреобразует кодовую точку (целочисленное значение) в символ Юникодаhex()hex(number)number: intstrШестнадцатеричное представление целого числа с префиксом «0x»int()int([x])

int(x, base=10)РазличныйintПриводит аргумент к типу intoct()oct(number)number: intstrВосьмеричное представление целого числа с префиксом «0o»ord()ord(c)c: str

len(c) == 1intВозвращает значение кодовой точки символа Юникодаstr()str(object=’‘)

str(b[, enc[, errors]])РазличныйstrПриводит аргумент к текстовому представлению, типу str

Дальше можно посмотреть полезные примеры использования этих функций.

Источник

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

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