Как кодировать и декодировать строкиpython-68

1. Основные понятия

Кодирование

Преобразование строки (str) в последовательность байт (bytes) по определенным правилам (кодировке)

Декодирование

Обратный процесс - преобразование байт (bytes) в строку (str)

2. Основные методы

2.1. Кодирование строки в байты

text = "Привет, мир!"  # Строка Unicode
encoded = text.encode('utf-8')  # Кодируем в UTF-8
print(encoded)  # b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82, \xd0\xbc\xd0\xb8\xd1\x80!'

Параметры encode():

  • encoding - название кодировки (обязательный)
  • errors - обработка ошибок ('strict', 'ignore', 'replace' и др.)

2.2. Декодирование байт в строку

decoded = encoded.decode('utf-8')  # Декодируем из UTF-8
print(decoded)  # "Привет, мир!"

3. Популярные кодировки

# UTF-8 (Unicode)
"Hello".encode('utf-8')  # b'Hello'

# ASCII (только английские символы)
"ABC".encode('ascii')  # b'ABC'

# Windows-1251 (кириллица)
"Привет".encode('cp1251')  # b'\xcf\xf0\xe8\xe2\xe5\xf2'

# Latin-1 (ISO-8859-1)
"é".encode('latin-1')  # b'\xe9'

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

При кодировании:

# 'strict' (по умолчанию) - вызовет UnicodeEncodeError
" café ".encode('ascii')  # Ошибка: символ 'é' не в ASCII

# 'ignore' - пропустит проблемные символы
" café ".encode('ascii', errors='ignore')  # b' caf '

# 'replace' - заменит на ?
" café ".encode('ascii', errors='replace')  # b' caf? '

При декодировании:

# Пример битых данных
broken_bytes = b'\xd0\x9f\xd1\x80\xd0\xb8\xd0'

# 'strict' (по умолчанию) - UnicodeDecodeError
broken_bytes.decode('utf-8')  # Ошибка

# 'ignore' - пропустит битые байты
broken_bytes.decode('utf-8', errors='ignore')  # "При"

# 'replace' - заменит на  (U+FFFD)
broken_bytes.decode('utf-8', errors='replace')  # "При�"

5. Утилиты для работы с кодировками

5.1. Определение кодировки

import chardet

data = b'\xd0\x9f\xd1\x80\xd0\xb8'
result = chardet.detect(data)
print(result)  # {'encoding': 'utf-8', 'confidence': 0.99}

5.2. Транслитерация

import transliterate

text = "Привет"
translit = transliterate.translit(text, reversed=True)
print(translit)  # "Privet"

6. Работа с файлами

Правильное открытие файлов:

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

# Запись с указанием кодировки
with open('file.txt', 'w', encoding='cp1251') as f:
    f.write("Текст в windows-1251")

7. Особые случаи

7.1. Бинарный режим и кодировки

# Чтение бинарных данных с последующим декодированием
with open('file.txt', 'rb') as f:
    binary_data = f.read()
    text = binary_data.decode('utf-8-sig')  # -sig для BOM

7.2. Кодировки URL

from urllib.parse import quote, unquote

url = "https://example.com/привет"
encoded_url = quote(url, safe='/:')
print(encoded_url)  # "https://example.com/%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82"

decoded_url = unquote(encoded_url)
print(decoded_url)  # Исходный URL

Резюмируем

  1. Кодирование: str.encode(encoding, errors) - строка → байты
  2. Декодирование: bytes.decode(encoding, errors) - байты → строка
  3. Основные кодировки: UTF-8 (рекомендуемая), ASCII, Windows-1251 и др.
  4. Обработка ошибок: 'strict', 'ignore', 'replace' и другие стратегии
  5. Работа с файлами: Всегда указывайте кодировку при открытии файлов
  6. Совет: Используйте UTF-8 везде, где возможно, для унификации

Для сложных сценариев используйте:

  • chardet для определения кодировки
  • codecs для расширенных возможностей работы с кодировками
  • urllib.parse для URL-кодирования