Python: Кодировка
На самом базовом уровне компьютер работает только с нулями и единицами, что составляет так называемый двоичный код. Каждую единицу или ноль называют битом (от binary digit, "двоичная цифра").
Любые данные в компьютере представлены просто как последовательность битов, например изображения, музыка и текст. Привычные нам числа из десятичной системы тоже можно представить в двоичной форме.
- 0 →
0 - 1 →
1 - 2 →
10
Как закодировать текст?
Компьютер не "понимает" текст. Чтобы работать с буквами и другими символами, их тоже нужно превратить в числа. Это делают с помощью кодировок, то есть таблиц, в которых каждому символу соответствует определенное число.
Самый простой способ состоит в том, чтобы пронумеровать буквы, начиная с 1.
a→1b→2- ...и так до
z→26
Теперь мы можем представить слово hello как набор чисел.
h e l l o
↓ ↓ ↓ ↓ ↓
8 5 12 12 15А good превращается в такую последовательность.
g o o d
↓ ↓ ↓ ↓
7 15 15 4Программа не знает, что это слово. Она просто видит инструкцию "нужно отобразить символ с кодом 8, потом с кодом 5 и т.д.".
ASCII. Первая массовая кодировка
Первые компьютеры работали в основном с английским языком. Для него в 1960-х годах придумали таблицу ASCII, включавшую 128 символов, в том числе латинский алфавит, цифры, знаки препинания, спецсимволы (@, #, !, \n) и управляющие коды.
Этого хватало для первых программ, но не для всего мира.
Когда компьютеры начали использовать в других странах, возникла проблема. В ASCII нет кириллицы, иероглифов, арабского письма, ударений, валютных символов и т. д.
Каждая страна или компания начала делать свою кодировку на основе ASCII.
- Windows придумала Windows-1251 для русского
- Apple создала Mac Roman
- Страны Восточной Европы, Азии и Ближнего Востока разработали свои варианты
Все эти кодировки были несовместимы между собой. Код 226 в одной кодировке мог быть буквой é, в другой буквой и, в третьей вообще техническим символом. Это приводило к настоящему хаосу.
Как выглядели проблемы с кодировками
Если вы видите в тексте вот это.
ÐÑивеÑ!или
undefinedЭто означает, что программа неправильно определила кодировку текста. Она получила последовательность байтов, но прочитала их не той таблицей.
Это было нормой в 1990-х и 2000-х. Одна программа писала текст в Windows-1251, другая читала его как ISO-8859-1, и в результате получался мусор.
Unicode и UTF-8. Конец бардака
Чтобы все починить, в 1990-х начали создавать универсальную таблицу Unicode, которая содержит символы всех письменных систем мира, в том числе латинский алфавит и кириллицу, китайское и арабское письмо, математические знаки, древнеегипетское письмо и даже эмодзи.
Внутри Unicode есть несколько форматов хранения. Наиболее распространенным из них является UTF-8. Он компактно кодирует английские символы, но может расширяться под любые другие.
Сегодня UTF-8 является стандартом по умолчанию в интернете, Python, Linux, базах данных и редакторах кода.
Зачем это знать программисту?
- Вы будете работать с текстом, и ошибки кодировки по-прежнему случаются, особенно при чтении файлов, обработке данных, взаимодействии с API и базами данных.
- Python по умолчанию использует UTF-8, но иногда приходится явно указывать кодировку при чтении файлов, например
open('file.txt', encoding='utf-8'). - Нужно уметь диагностировать проблемы. Например, если видите "кракозябры", это почти наверняка ошибка кодировки.
Задание
Иногда символы нужно вывести программно по их коду, не набирая их с клавиатуры напрямую. Найдите коды символов ~, ^ и % в таблице ASCII и выведите каждый на отдельной строке с помощью функции chr().
print(chr(...))
print(chr(...))
print(chr(...))Например, символ ? имеет код 63:
print(chr(63)) # вывод: ?Полезное
Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект
Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества
Ваше упражнение проверяется по этим тестам
import runpy
def test(capsys):
expected = "~\n^\n%"
runpy.run_module('solution')
out, _ = capsys.readouterr()
assert out.strip() == expectedРешение учителя откроется через:
20:00
