Существует Юникод кодировка, с 2 типами кодирования:
- UTF-8 UTF-16 UTF-32
- UCS-2 UCS-4
UTF-16 UTF-32 - число указывает количество затрачиваемых битов.
Первоначально при переходе с питона 2 на питон 3 использовалась UTF-16 по этому даже когда мы работаем с символами, что могут умещаться в ASCII то всеравно тратили больше памяти на их хранение, по этому с питон 3.3 все определяется в зависимости от строки.
Если строка умещается в UTF-8, то он и используется, как в случае со
строкой hello world, если русские символы то уже используется UTF-16
Рассмотрим пример, функция chr() принимает число и по нему вычисляет
по Юникоду какому символу он соответствует, и наоборот функция ord
принимает символ и вычисляет его число по Юникоду.
a = 'hello world'
print(list(map(ord, a)))
b = 'Привет мир'
print(list(map(ord, b)))
c = '⏸'
print(list(map(ord, c)))
print(chr(9208))
print(chr(127025))
# Вывод
# [104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]
# [1055, 1088, 1080, 1074, 1077, 1090, 32, 1084, 1080, 1088]
# [9208]
# ⏸
# 🀱Как можем видеть строка hello world состоит только из латиницы, так
что полностью умещается в ASCII в этой таблице символов содержится
кодировка 127 символов, так и есть с английского слово полностью
умещается в это число, так что для кодировки этой строки
используется UTF-8
Вторая строка это русские символы, для них уже используется UTF-16
Третий случай это эмодзи, они тоже есть в таблице Юникода.
Четвертый случай это символ домино, для него уже используется UTF-32
В Питоне есть 2 типа строк, Unicod строки и Байт строки, по дефолту
все строки имеют кодировку Unicod. Для обьявления Байт строк перед
строкой записываем спец символ b и она участвует в выводе на
экран, также они имеют разный тип объектов, str и bytes вот
пример:
str_1 = 'привет мир'
str_2 = b'hello world'
print('Unicod строка: ', str_1)
print('Байтов строка: ', str_2)
print(f'Тип Unicod роки: {type(str_1)}\nТип Байт строк: {type(str_2)}')
# Вывод
# Unicod строка: привет мир
# Байтов строка: b'hello world'
# Тип Unicod роки: <class 'str'>
# Тип Байт строк: <class 'bytes'>Существует кодировка ASCII - которая включает в себя небольшой набор чисел и латиницы, именно по этой кодировке работал питон2
Есть таблица Unicod и ее часть UTF-8 включает в себя всю ASCII и расширяет ее, теперь в Питон3 по дефолту используется именно эта кодировка, и это работает не только на содержимое строк, но и на написание самой программы, теперь в качестве символов имен можно использовать все то что входит в Unicod, так что теперь можно давать русские и не только, названия именам:
переменна = "Да это работает"
print(переменна)
class МойКласс:
def __init__(self, x, y):
self.x = x
self.y = y
обьект_моего_классса = МойКласс(10, 20)
print(обьект_моего_классса.__dict__)
# Вывод
# Да это работает
# {'x': 10, 'y': 20}Для того чтобы иметь возможность использовать функции Python3
во второй версии языка, используется спец модуль __future__
from __future__ import print_functionВ системе кодировок есть привязка к целым числам, для получения значения символа от числа или числа от символа, используется 2 метода, все это делается из таблицы имен Unicod.
-
chr()- по числу возвращает его символ. -
ord()- по символу возвращает его число.
print(chr(65))
print(ord('A'))
# Вывод
# A
# 65