UTF-8 в Python: ключевые аспекты работы с текстом

Раздел: Работа со строками -> Кодировки

Общие принципы работы с UTF-8 в Python

В Python 3 строки (тип str) по умолчанию хранятся в кодировке Unicode (UCS-4 или UCS-2 в зависимости от сборки). При взаимодействии с внешним миром - файлами, сетевыми запросами, базами данных - строки необходимо преобразовывать в последовательности байтов. Наиболее распространённой кодировкой для обмена данными является UTF-8. Основной инструмент - методы .encode() и .decode(), а также параметр encoding в функции open().

# Чтение файла в кодировке UTF-8
with open('example.txt', 'r', encoding='utf-8') as f:
    content = f.read()
print(content)

Unicode символ python (unicode символ в python)

Этот код корректно прочитает содержимое файла example.txt, предполагая, что он сохранён в UTF-8. Если файл имеет другую кодировку, возникнет ошибка UnicodeDecodeError. Решение - указать фактическую кодировку или использовать параметр errors='replace' для замены нечитаемых символов.

Типичная ошибка:

with open('file_cp1251.txt', 'r', encoding='utf-8') as f:
    data = f.read()
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd0 in position 0

Python bytes encoding (кодирование байтов в python)

Способ решения: узнать правильную кодировку (например, cp1251) и указать её, или применить автоматическое определение с библиотекой chardet.

Как прочитать текстовый файл в кодировке UTF-8 с обработкой ошибок?

Для чтения файла с гарантией отсутствия сбоев используется параметр errors:

with open('unknown_encoding.txt', 'r', encoding='utf-8', errors='replace') as f:
    text = f.read()

Encoding decoding python (кодирование и декодирование в python)

Результат: нечитаемые байты заменяются символом-заменителем (обычно �). Другие варианты: 'ignore' (пропуск), 'backslashreplace' (escape-последовательности).

Как сохранить строку в файл с кодировкой UTF-8?

Запись строки в файл выполняется с тем же параметром encoding:

text = "Привет, мир!"
with open('output.txt', 'w', encoding='utf-8') as f:
    f.write(text)

Encoding python (кодировки в python)

При записи строки автоматически кодируются в UTF-8. Если попытаться записать строку, содержащую символы, не представимые в целевой кодировке (например, в ASCII), возникнет ошибка UnicodeEncodeError. Параметр errors и здесь помогает.

Как преобразовать строку из другой кодировки (например, cp1251) в UTF-8?

Необходимо сначала декодировать байты в строку, затем закодировать обратно, или просто сохранить в файл с UTF-8. Разберём на примере:

# Исходные данные в cp1251 (байты)
bytes_cp1251 = b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
# Декодируем в строку Unicode
unicode_str = bytes_cp1251.decode('cp1251')
print(unicode_str)  # Вывод: Привет
# Кодируем в UTF-8 (байты)
utf8_bytes = unicode_str.encode('utf-8')
print(utf8_bytes)   # b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' (то же самое, так как русские буквы в UTF-8 также занимают 2 байта)

Python 2 encoding (кодировки в python 2)

Ошибки могут возникнуть, если исходные байты не соответствуют заявленной кодировке.

Как работать с Unicode в Python 3 без явного указания кодировки?

Внутреннее представление строк уже Unicode, поэтому операции конкатенации, срезов, поиска выполняются корректно. Однако при выводе в консоль или отправке по сети нужно учитывать кодировку терминала/протокола. Например, для корректного вывода в Windows часто требуется указать кодировку консоли:

import sys
sys.stdout.reconfigure(encoding='utf-8')
print('Русский текст')

Python encode (метод encode в python)

Как использовать UTF-8 при работе с JSON?

Модуль json по умолчанию работает с Unicode строками. При сериализации в файл рекомендуется указывать ensure_ascii=False и кодировку UTF-8:

import json
data = {'message': 'Привет'}
with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

Если этого не сделать, русские буквы будут записаны как escape-последовательности (например, \u041f\u0440\u0438\u0432\u0435\u0442).

- Python encoding utf (кодировка utf в python)
- Python coding utf (кодировка utf-8 в python)

Расширенные примеры работы с кодировкой UTF-8 в Python

Автоматическое определение кодировки файла с помощью chardet

Библиотека chardet позволяет определить кодировку по образцу байтов. Пример:

Пример
import chardet

with open('unknown.txt', 'rb') as f:
    raw = f.read(10000)  # читаем первые 10 КБ
    result = chardet.detect(raw)
    print(result)   # {'encoding': 'utf-8', 'confidence': 0.99, ...}

encoding = result['encoding']
with open('unknown.txt', 'r', encoding=encoding) as f:
    content = f.read()
print(content[:100])
Вывод:
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
Первые 100 символов текста...

Обработка BOM (Byte Order Mark) в UTF-8 файлах

Некоторые редакторы добавляют BOM (последовательность \xef\xbb\xbf) в начало файла UTF-8. Python не удаляет её автоматически. Пример чтения с удалением BOM:

Пример
with open('file_with_bom.txt', 'rb') as f:
    raw = f.read()
    if raw.startswith(b'\xef\xbb\xbf'):
        raw = raw[3:]
    text = raw.decode('utf-8')
print(text)

Или с использованием модуля codecs:

Пример
import codecs

with codecs.open('file_with_bom.txt', 'r', encoding='utf-8-sig') as f:
    text = f.read()
print(text)  # BOM автоматически пропущен

Конвертация множества файлов из cp1251 в UTF-8

Пример
import os

def convert_files(src_dir, dst_dir, src_enc='cp1251', dst_enc='utf-8'):
    if not os.path.exists(dst_dir):
        os.makedirs(dst_dir)
    for filename in os.listdir(src_dir):
        if filename.endswith('.txt'):
            src_path = os.path.join(src_dir, filename)
            dst_path = os.path.join(dst_dir, filename)
            with open(src_path, 'r', encoding=src_enc) as f:
                content = f.read()
            with open(dst_path, 'w', encoding=dst_enc) as f:
                f.write(content)
    print('Конвертация завершена.')

convert_files('./source', './converted')

Работа с UTF-8 в HTTP запросах (библиотека requests)

Библиотека requests автоматически декодирует ответ сервера, предполагая кодировку из заголовка Content-Type. Если сервер передаёт UTF-8, всё корректно. Принудительная установка кодировки:

Пример
import requests

response = requests.get('https://example.com')
# Если сервер не указал кодировку, requests может определить её из содержимого
response.encoding = 'utf-8'  # принудительно
text = response.text
print(text[:200])

Использование pathlib с указанием кодировки

Пример
from pathlib import Path

file_path = Path('data.txt')
# Чтение
content = file_path.read_text(encoding='utf-8')
# Запись
file_path.write_text('Новый текст', encoding='utf-8')

Методы read_text и write_text принимают параметр encoding, что упрощает код.

Преобразование строки с неизвестной кодировкой с использованием декодера-заменителя

Пример
# Предположим, есть байты, частично повреждённые
corrupted_bytes = b'Te\x80xt'  # невалидный байт для UTF-8
text = corrupted_bytes.decode('utf-8', errors='replace')
print(repr(text))  # 'Te�xt'

# Или с игнорированием
text2 = corrupted_bytes.decode('utf-8', errors='ignore')
print(repr(text2))  # 'Text'

Работа с разными кодировками в одном скрипте с использованием метки кодировки в начале файла

Пример
# Содержимое файла first_line_enc.py:
# -*- coding: cp1251 -*-
print('Привет')  # в cp1251

Интерпретатор Python читает эту метку и декодирует исходный код в указанной кодировке. Сам скрипт должен быть сохранён в cp1251. Рекомендуется всегда использовать UTF-8 для файлов исходного кода.

Кодировка UTF-8 в Python - comments

En
Python coding utf (python)