← Назад к вопросам

Что такое кодировка?

2.3 Middle🔥 61 комментариев
#Тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Кодировка

Кодировка (encoding) — это система правил, которая определяет, как текстовые символы преобразуются в последовательность байтов (двоичное представление) и обратно. Это фундаментальный концепт в программировании, особенно при работе с текстом, файлами и сетью.

Почему кодировки нужны

Компьютер работает только с числами (0 и 1). Чтобы сохранить текст, нужно каким-то образом преобразовать символы в числа. Кодировка — это договоренность о том, какой байт какому символу соответствует.

Например, в кодировке ASCII:

  • буква 'A' = 65
  • буква 'a' = 97
  • цифра '0' = 48

Проблема ASCII в том, что она содержит только 128 символов, чего недостаточно для русского, китайского и других алфавитов.

Основные кодировки

ASCII (American Standard Code for Information Interchange):

# ASCII содержит только латинские буквы и цифры
orb = b'A'  # 65 в ASCII
print(ord('A'))  # 65
print(chr(65))   # 'A'

UTF-8 (Universal Character Set Transformation Format, 8-bit):

  • Современный стандарт де-факто
  • Поддерживает все символы мира
  • Переменная длина: 1-4 байта на символ
  • ASCII-совместима (все ASCII символы кодируются 1 байтом)
# UTF-8 поддерживает русские буквы, эмодзи и т.д.
text = "Привет" 
encoded = text.encode('utf-8')  # b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
print(encoded)

decoded = encoded.decode('utf-8')  # "Привет"
print(decoded)

# UTF-8 использует несколько байтов для русских букв
print(len("А".encode('utf-8')))  # 2 (Cyrillic требует 2 байта)
print(len("A".encode('utf-8')))   # 1 (Latin требует 1 байт)

UTF-16 и UTF-32 — другие варианты UTF с фиксированной или переменной длиной.

Кодировка Windows-1251:

  • Используется в некоторых старых русских системах
  • Не совместима с ASCII
  • Устарела, не рекомендуется использовать

Проблема неправильной кодировки

Когда вы пытаетесь декодировать текст с неправильной кодировкой, получается "каша" — бессмысленные символы:

# Правильно закодировали в UTF-8, но пытались декодировать как ASCII
text = "Привет"
utf8_bytes = text.encode('utf-8')
print(utf8_bytes)  # b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'

# Неправильная попытка декодирования
try:
    decoded = utf8_bytes.decode('ascii')
except UnicodeDecodeError as e:
    print(f"Ошибка: {e}")
    # UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0

# Правильное декодирование
decoded = utf8_bytes.decode('utf-8')
print(decoded)  # "Привет"

Работа с кодировками в Python

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

# Строка -> байты (кодирование)
text = "Привет"
bytes_utf8 = text.encode('utf-8')
print(bytes_utf8)  # b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'

# Байты -> строка (декодирование)
decoded = bytes_utf8.decode('utf-8')
print(decoded)  # "Привет"

# Дефолт в Python 3 — UTF-8
text.encode()  # Эквивалентно encode('utf-8')

Чтение файлов с нужной кодировкой:

# Правильно — указываем кодировку
with open('file.txt', 'r', encoding='utf-8') as f:
    content = f.read()

# Можно также использовать другие кодировки
with open('file.txt', 'r', encoding='windows-1251') as f:
    content = f.read()

Работа с URL и HTML:

# URL требует кодировки символов
from urllib.parse import quote
url = quote("Привет")  # %D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82
print(url)

Практические советы

  • Всегда используйте UTF-8 в современных проектах
  • Явно указывайте кодировку при работе с файлами и сетью
  • Проверяйте заголовки HTTP (Content-Type), чтобы понять кодировку ответа
  • Никогда не игнорируйте ошибки UnicodeDecodeError — это признак проблемы с кодировкой

Кодировка — это не сложный, но важный концепт, который спасает от множества проблем с текстом и интернациональными символами.