Spec-Zone.ru › Python 3.12

codecs — Реестр кодеков и базовые классы

Исходный код: Lib/codecs.py

Этот модуль определяет базовые классы для стандартных кодеков Python (кодировщики и декодировщики) и предоставляет доступ к внутреннему реестру кодеков Python, который управляет процессом поиска кодеков и обработки ошибок. Большинство стандартных кодеков являются кодировками текста, которые кодируют текст в байты (и декодируют байты в текст), но также существуют кодеки, которые кодируют текст в текст и байты в байты. Пользовательские кодеки могут кодировать и декодировать между произвольными типами, но некоторые возможности модуля ограничены использованием именно с кодировками текста или с кодеками, которые кодируют в bytes.

Модуль определяет следующие функции для кодирования и декодирования с помощью любого кодека:

codecs.encode(obj, encoding='utf-8', errors='strict')

Кодирует obj с помощью зарегистрированного для encoding кодека.

Errors может быть задано для настройки желаемой схемы обработки ошибок. По умолчанию обработчик ошибок — 'strict', что означает, что ошибки кодирования вызывают ValueError (или более специализированный подкласс кодека, такой как UnicodeEncodeError). Дополнительную информацию об обработке ошибок кодека см. в разделе Базовые классы кодеков.

codecs.decode(obj, encoding='utf-8', errors='strict')

Декодирует obj с помощью зарегистрированного для encoding кодека.

Errors может быть задано для настройки желаемой схемы обработки ошибок. По умолчанию обработчик ошибок — 'strict', что означает, что ошибки декодирования вызывают ValueError (или более специализированный подкласс кодека, такой как UnicodeDecodeError). Дополнительную информацию об обработке ошибок кодека см. в разделе Базовые классы кодеков.

Полные сведения о каждом кодеке также можно получить напрямую:

codecs.lookup(encoding)

Ищет информацию о кодеке в реестре кодеков Python и возвращает объект CodecInfo, как определено ниже.

Кодировки сначала ищутся в кэше реестра. Если не найдено, сканируется список зарегистрированных функций поиска. Если объект CodecInfo не найден, поднимается LookupError. В противном случае объект CodecInfo сохраняется в кэше и возвращается вызывающей стороне.

class codecs.CodecInfo(encode, decode, streamreader=None, streamwriter=None, incrementalencoder=None, incrementaldecoder=None, name=None)

Детали кодека при поиске в реестре кодеков. Аргументы конструктора хранятся в атрибутах с тем же именем:

name

Имя кодировки.

encode
decode

Функции статического кодирования и декодирования. Они должны быть функциями или методами, имеющими такой же интерфейс, как методы encode() и decode() экземпляров Codec (см. Интерфейс кодеков). Функции или методы ожидают работы в бессостоятельном режиме.

incrementalencoder
incrementaldecoder

Классы или фабричные функции для инкрементального кодировщика и декодировщика. Они должны предоставлять интерфейс, определенный базовыми классами IncrementalEncoder и IncrementalDecoder соответственно. Инкрементальные кодеки могут сохранять состояние.

streamwriter
streamreader

Классы или фабричные функции для потокового записи и чтения. Они должны предоставлять интерфейс, определенный базовыми классами StreamWriter и StreamReader соответственно. Потоковые кодеки могут сохранять состояние.

Для упрощения доступа к различным компонентам кодеков модуль предоставляет эти дополнительные функции, использующие lookup() для поиска кодека:

codecs.getencoder(encoding)

Ищет кодек для заданной кодировки и возвращает его функцию кодирования.

Возвышает LookupError в случае, если кодировка не найдена.

codecs.getdecoder(encoding)

Ищет кодек для заданной кодировки и возвращает его функцию декодирования.

Возвышает LookupError в случае, если кодировка не найдена.

codecs.getincrementalencoder(encoding)

Ищет кодек для заданной кодировки и возвращает его класс или фабричную функцию инкрементального кодировщика.

Возвышает LookupError в случае, если кодировка не найдена или кодек не поддерживает инкрементального кодировщика.

codecs.getincrementaldecoder(encoding)

Ищет кодек для заданной кодировки и возвращает его класс или фабричную функцию инкрементального декодировщика.

Возвышает LookupError в случае, если кодировка не найдена или кодек не поддерживает инкрементального декодировщика.

codecs.getreader(encoding)

Ищет кодек для заданной кодировки и возвращает его класс StreamReader или фабричную функцию.

Возвышает LookupError в случае, если кодировка не найдена.

codecs.getwriter(encoding)

Ищет кодек для заданной кодировки и возвращает его класс StreamWriter или фабричную функцию.

Возвышает LookupError в случае, если кодировка не найдена.

Пользовательские кодеки доступны путем регистрации соответствующей функции поиска кодеков:

codecs.register(search_function)

Регистрирует функцию поиска кодека. Функции поиска ожидают один аргумент — имя кодировки строчными буквами с дефисами и пробелами, преобразованными в подчеркивания, и возвращают объект CodecInfo. В случае если функция поиска не может найти заданную кодировку, она должна вернуть None.

Изменено в версии 3.9: Дефисы и пробелы преобразуются в подчеркивания.

codecs.unregister(search_function)

Удаляет функцию поиска кодека и очищает кэш реестра. Если функция поиска не зарегистрирована, ничего не делается.

Добавлен в версии 3.10.

В то время как встроенные open() и связанный модуль io являются рекомендуемым подходом для работы с закодированными текстовыми файлами, этот модуль предоставляет дополнительные служебные функции и классы, которые позволяют использовать более широкий спектр кодеков при работе с бинарными файлами:

codecs.open(filename, mode='r', encoding=None, errors='strict', buffering=-1)

Открыть закодированный файл с заданным режимом и вернуть экземпляр StreamReaderWriter, обеспечивая прозрачное кодирование/декодирование. По умолчанию режим файла — 'r', что означает открытие файла в режиме чтения.

Примечание

Если кодировка не None, то подлежащие кодированию файлы всегда открываются в двоичном режиме. Автоматическое преобразование '\n' при чтении и записи не выполняется. Аргумент режим может быть любым двоичным режимом, допустимым для встроенной функции open(); 'b' добавляется автоматически.

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

ошибки могут быть заданы для определения обработки ошибок. По умолчанию используется 'strict' , что вызывает ValueError в случае ошибки кодирования.

буферизация имеет то же значение, что и для встроенной функции open(). По умолчанию она равна -1, что означает использование размера буфера по умолчанию.

Изменено в версии 3.11: Режим 'U' был удален.

codecs.EncodedFile(file, data_encoding, file_encoding=None, errors='strict')

Возвращает экземпляр StreamRecoder, обернутую версию file, которая обеспечивает прозрачную транскодировку. Исходный файл закрывается при закрытии обернутой версии.

Данные, записываемые в обернутый файл, декодируются в соответствии с заданной data_encoding и затем записываются в исходный файл в виде байтов с использованием file_encoding. Байты, считанные из исходного файла, декодируются в соответствии с file_encoding, а результат кодируется с помощью data_encoding.

Если file_encoding не указан, он по умолчанию равен data_encoding.

ошибки могут быть заданы для определения обработки ошибок. По умолчанию используется 'strict', что вызывает ValueError в случае ошибки кодирования.

codecs.iterencode(iterator, encoding, errors='strict', **kwargs)

Использует инкрементный кодировщик для итеративного кодирования входных данных, предоставляемых iterator. Эта функция является генератором. Аргумент ошибки (а также любые другие ключевые аргументы) передаются в инкрементный кодировщик.

Эта функция требует, чтобы кодек принимал объекты текста str для кодирования. Поэтому она не поддерживает кодировщики байты-в-байты, такие как base64_codec.

codecs.iterdecode(iterator, encoding, errors='strict', **kwargs)

Использует инкрементный декодер для итеративного декодирования входных данных, предоставляемых iterator. Эта функция является генератором. Аргумент ошибки (а также любые другие ключевые аргументы) передаются в инкрементный декодер.

Эта функция требует, чтобы кодек принимал объекты bytes для декодирования. Поэтому она не поддерживает кодировщики текст-в-текст, такие как rot_13, хотя rot_13 может быть использован эквивалентно с iterencode().

Модуль также предоставляет следующие константы, которые полезны для чтения и записи в платформозависимые файлы:

codecs.BOM
codecs.BOM_BE
codecs.BOM_LE
codecs.BOM_UTF8
codecs.BOM_UTF16
codecs.BOM_UTF16_BE
codecs.BOM_UTF16_LE
codecs.BOM_UTF32
codecs.BOM_UTF32_BE
codecs.BOM_UTF32_LE

Эти константы определяют различные последовательности байтов, являющиеся метками порядка байтов Юникода (BOM) для нескольких кодировок. Они используются в потоках данных UTF-16 и UTF-32 для указания порядка байтов и в UTF-8 в качестве подписи Юникода. BOM_UTF16 — это либо BOM_UTF16_BE, либо BOM_UTF16_LE в зависимости от родного порядка байтов платформы, BOM — псевдоним для BOM_UTF16, BOM_LE для BOM_UTF16_LE и BOM_BE для BOM_UTF16_BE. Остальные представляют BOM в кодировках UTF-8 и UTF-32.

Классы кодеков базового уровня

Модуль codecs определяет набор базовых классов, которые задают интерфейсы для работы с объектами кодирования и могут быть использованы в качестве основы для реализации пользовательских кодеков.

Каждый кодек должен определить четыре интерфейса для использования в качестве кодека в Python: бессостоятельный кодировщик, бессостоятельный декодер, потоковый читатель и потоковый писатель. Потоковые читатели и писатели обычно повторно используют бессостоятельных кодировщиков/декодеров для реализации протоколов файлов. Авторы кодеков также должны определить, как кодек будет обрабатывать ошибки кодирования и декодирования.

Обработчики ошибок

Для упрощения и стандартизации обработки ошибок кодеки могут реализовывать различные схемы обработки ошибок, принимая строковый аргумент errors:

>>> 'German ß, ♬'.encode(encoding='ascii', errors='backslashreplace')
b'German \\xdf, \\u266c'
>>> 'German ß, ♬'.encode(encoding='ascii', errors='xmlcharrefreplace')
b'German ß, ♬'

Следующие обработчики ошибок могут использоваться со всеми кодеками Python Стандартные кодировки:

Значение

Значение

'strict'

Вызвать UnicodeError (или подкласс), это значение по умолчанию. Реализовано в strict_errors().

'ignore'

Проигнорировать некорректные данные и продолжить без дальнейших уведомлений. Реализовано в ignore_errors().

'replace'

Заменить маркером замены. При кодировании использовать ? (символ ASCII). При декодировании использовать � (U+FFFD, официальный символ ЗАМЕЩЕНИЯ). Реализовано в replace_errors().

'backslashreplace'

Заменить обратными слешами с последовательностями экранирования. При кодировании использовать шестнадцатеричную форму кода Unicode с форматами \xhh \uxxxx \Uxxxxxxxx. При декодировании использовать шестнадцатеричную форму значения байта с форматом \xhh. Реализовано в backslashreplace_errors().

'surrogateescape'

При декодировании заменить байт отдельным кодом суррогата в диапазоне от U+DC80 до U+DCFF. Этот код затем будет преобразован обратно в тот же байт, когда будет использоваться обработчик ошибок 'surrogateescape' при кодировании данных. (См. PEP 383 для получения дополнительной информации.)

Следующие обработчики ошибок применимы только к кодированию (в рамках кодирования текста):

Значение

Значение

'xmlcharrefreplace'

Заменить на числовую ссылку символа XML/HTML, которая представляет собой десятичную форму кода Unicode с форматом &#num;. Реализовано в xmlcharrefreplace_errors().

'namereplace'

Заменить на \N{...} последовательность экранирования, то, что появляется в фигурных скобках, является свойством Name из базы данных Unicode Character. Реализовано в namereplace_errors().

Кроме того, следующий обработчик ошибок специфичен для заданных кодеков:

Значение

Кодеки

Значение

'surrogatepass'

utf-8, utf-16, utf-32, utf-16-be, utf-16-le, utf-32-be, utf-32-le

Разрешить кодирование и декодирование кода суррогата (U+D800 - U+DFFF) как обычного кода. В противном случае эти кодеки рассматривают наличие кода суррогата в str как ошибку.

Добавлен в версии 3.1: Обработчики ошибок 'surrogateescape' и 'surrogatepass'.

Изменено в версии 3.4: Обработчик ошибок 'surrogatepass' теперь работает с кодеками utf-16* и utf-32*.

Добавлен в версии 3.5: Обработчик ошибок 'namereplace'.

Изменено в версии 3.5: Обработчик ошибок 'backslashreplace' теперь работает с декодированием и переводом.

Множество разрешенных значений может быть расширено путем регистрации нового обработчика ошибок с именем:

codecs.register_error(name, error_handler)

Зарегистрировать функцию обработки ошибок error_handler под именем name. Функция error_handler будет вызываться при кодировании и декодировании в случае ошибки, когда name указан в параметре errors.

При кодировании error_handler будет вызываться с экземпляром UnicodeEncodeError, который содержит информацию о местоположении ошибки. Обработчик ошибок должен либо вызвать эту ошибку, либо другую ошибку, либо вернуть кортеж с заменой для некодируемой части входных данных и позицией, где должно продолжаться кодирование. Замена может быть либо str, либо bytes. Если замена представляет собой байты, кодировщик просто скопирует их в буфер вывода. Если замена представляет собой строку, кодировщик закодирует замену. Кодирование продолжается с исходными входными данными в указанной позиции. Отрицательные значения позиции будут обрабатываться как относительные к концу входной строки. Если результирующая позиция выходит за пределы, будет вызвана ошибка IndexError.

Декодирование и перевод работают аналогично, за исключением того, что error_handler будет передан UnicodeDecodeError или UnicodeTranslateError, и замена из обработчика ошибок будет помещена непосредственно в вывод.

Ранее зарегистрированные обработчики ошибок (включая стандартные обработчики ошибок) могут быть найдены по имени:

codecs.lookup_error(name)

Возвращает обработчик ошибок, ранее зарегистрированный под именем name.

Вызывает LookupError в случае, если обработчик не найден.

Следующие стандартные обработчики ошибок также доступны в качестве функций модуля:

codecs.strict_errors(exception)

Реализует обработку ошибок 'strict'.

Каждая ошибка кодирования или декодирования вызывает UnicodeError.

codecs.ignore_errors(exception)

Реализует обработку ошибок 'ignore'.

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

codecs.replace_errors(exception)

Реализует обработку ошибок 'replace'.

Заменяет ? (символ ASCII) при ошибках кодирования или � (U+FFFD, официальный символ ЗАМЕЩЕНИЯ) при ошибках декодирования.

codecs.backslashreplace_errors(exception)

Реализует обработку ошибок 'backslashreplace'.

Некорректные данные заменяются обратной слешей с последовательностью экранирования. При кодировании используется шестнадцатеричная форма кода Unicode с форматами \xhh \uxxxx \Uxxxxxxxx. При декодировании используется шестнадцатеричная форма значения байта с форматом \xhh.

Изменено в версии 3.5: Работает с декодированием и переводом.

codecs.xmlcharrefreplace_errors(exception)

Реализует обработку ошибок 'xmlcharrefreplace' (только для кодирования в рамках кодирования текста).

Некодируемый символ заменяется соответствующей числовой ссылкой символа XML/HTML, которая представляет собой десятичную форму кода Unicode с форматом &#num;.

codecs.namereplace_errors(exception)

Реализует обработку ошибок 'namereplace' (только для кодирования в рамках кодирования текста).

Некодируемый символ заменяется \N{...} последовательностью экранирования. Набор символов, которые появляются в фигурных скобках, — это свойство Name из базы данных Unicode Character. Например, немецкая строчная буква 'ß' будет преобразована в последовательность байтов \N{LATIN SMALL LETTER SHARP S}.

Добавлен в версии 3.5.

Бессостоятельное кодирование и декодирование

Базовый класс Codec определяет эти методы, которые также определяют функциональные интерфейсы бессостоятельного кодера и декодера:

class codecs.Codec
encode(input, errors='strict')

Кодирует объект input и возвращает кортеж (объект вывода, длина потреблённого). Например, кодирование текста преобразует строковый объект в байтовый объект, используя кодировку набора символов (например, cp1252 или iso-8859-1).

Аргумент errors определяет обработку ошибок. По умолчанию используется обработка 'strict'.

Метод не должен хранить состояние в экземпляре Codec. Используйте StreamWriter для кодеков, которым необходимо сохранять состояние для повышения эффективности кодирования.

Кодер должен уметь обрабатывать входные данные нулевой длины и возвращать пустой объект типа объекта вывода в этом случае.

decode(input, errors='strict')

Декодирует объект input и возвращает кортеж (объект вывода, длина потреблённого). Например, для кодирования текста декодирование преобразует байтовый объект, закодированный с использованием определённой кодировки набора символов, в строковый объект.

Для кодировок текста и кодеков байты-в-байты input должен быть байтовым объектом или объектом, предоставляющим интерфейс для чтения буфера только для чтения — например, объекты буферов и файлы, отображённые в памяти.

Аргумент errors определяет обработку ошибок. По умолчанию используется обработка 'strict'.

Метод не должен хранить состояние в экземпляре Codec. Используйте StreamReader для кодеков, которым необходимо хранить состояние для повышения эффективности декодирования.

Декодер должен уметь обрабатывать входные данные нулевой длины и возвращать пустой объект типа объекта вывода в этом случае.

Инкрементальное кодирование и декодирование

Классы IncrementalEncoder и IncrementalDecoder предоставляют базовый интерфейс для инкрементального кодирования и декодирования. Кодирование/декодирование входных данных выполняется не одним вызовом функции бессостоятельного кодера/декодера, а множественными вызовами метода encode()/decode() инкрементального кодера/декодера. Инкрементальный кодер/декодер отслеживает процесс кодирования/декодирования во время вызовов методов.

Объединённый вывод вызовов метода encode()/decode() такой же, как если бы все отдельные входные данные были объединены в один, а этот вход был закодирован/декодирован бессостоятельным кодером/декодером.

Объекты IncrementalEncoder

Класс IncrementalEncoder используется для кодирования входных данных поэтапно. Он определяет следующие методы, которые каждый инкрементальный кодер должен определить для совместимости с реестром кодеков Python.

class codecs.IncrementalEncoder(errors='strict')

Конструктор для экземпляра IncrementalEncoder.

Все инкрементальные кодеры должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только те, которые определены здесь, используются реестром кодеков Python.

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

Аргумент errors будет присвоен атрибуту с тем же именем. Присвоение этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок во время жизненного цикла объекта IncrementalEncoder.

encode(object, final=False)

Кодирует object (учитывая текущее состояние кодера) и возвращает результирующий закодированный объект. Если это последний вызов encode(), final должно быть True (по умолчанию False).

reset()

Сбросить кодер в начальное состояние. Вывод отбрасывается: вызовите .encode(object, final=True), передав пустую байтовую или текстовую строку при необходимости, для сброса кодера и получения вывода.

getstate()

Возвращает текущее состояние кодера, которое должно быть целым числом. Реализация должна гарантировать, что 0 является наиболее распространённым состоянием. (Состояния, которые сложнее целых чисел, можно преобразовать в целое число, используя маршалинг/пиклинг состояния и кодирование байтов полученной строки в целое число.)

setstate(state)

Установить состояние кодера на state. state должно быть состоянием кодера, возвращённым методом getstate().

Объекты IncrementalDecoder

Класс IncrementalDecoder используется для декодирования входных данных поэтапно. Он определяет следующие методы, которые каждый инкрементальный декодер должен определить для совместимости с реестром кодеков Python.

class codecs.IncrementalDecoder(errors='strict')

Конструктор для экземпляра IncrementalDecoder.

Все инкрементальные декодеры должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только те, которые определены здесь, используются реестром кодеков Python.

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

Аргумент errors будет присвоен атрибуту с тем же именем. Присвоение этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок во время жизненного цикла объекта IncrementalDecoder.

decode(object, final=False)

Декодирует object (учитывая текущее состояние декодера) и возвращает результирующий декодированный объект. Если это последний вызов decode(), final должно быть True (по умолчанию False). Если final равно True, декодер должен полностью декодировать входные данные и очистить все буферы. Если это невозможно (например, из-за неполных байтовых последовательностей в конце входных данных), он должен инициировать обработку ошибок так же, как в бессостоятельном случае (что может вызвать исключение).

reset()

Сбросить декодер в начальное состояние.

getstate()

Возвращает текущее состояние декодера. Это должен быть кортеж из двух элементов, первый — буфер, содержащий ещё не декодированные входные данные. Второй — целое число и может содержать дополнительную информацию о состоянии. (Реализация должна гарантировать, что 0 является наиболее распространённой дополнительной информацией о состоянии.) Если эта дополнительная информация о состоянии равна 0, то должно быть возможно установить декодер в состояние, в котором нет буферизованных входных данных и 0 в качестве дополнительной информации о состоянии, так что подача ранее буферизованных входных данных декодеру возвращает его в предыдущее состояние без создания какого-либо вывода. (Дополнительная информация о состоянии, которая сложнее, чем целые числа, может быть преобразована в целое число путём маршалинга/пиклирования информации и кодирования байтов полученной строки в целое число.)

setstate(state)

Установить состояние декодера на state. state должен быть состоянием декодера, возвращённым методом getstate().

Кодирование и декодирование потоков

Классы StreamWriter и StreamReader предоставляют общие рабочие интерфейсы, которые можно использовать для очень лёгкой реализации новых подмодулей кодирования. См. encodings.utf_8 для примера того, как это сделать.

Объекты StreamWriter

Класс StreamWriter является подклассом Codec и определяет следующие методы, которые должен определять каждый объект записи потока, чтобы быть совместимым с реестром кодировок Python.

class codecs.StreamWriter(stream, errors='strict')

Конструктор экземпляра StreamWriter.

Все объекты записи потока должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только определённые здесь используются реестром кодировок Python.

Аргумент stream должен быть объектом типа файл, открытым для записи текстовых или двоичных данных, как это подходит для конкретной кодировки.

Объект StreamWriter может реализовывать различные схемы обработки ошибок, предоставляя ключевой аргумент errors. См. Обработчики ошибок для стандартных обработчиков ошибок, которые может поддерживать кодировка базового потока.

Аргумент errors будет присвоен атрибуту с тем же именем. Присвоение этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок во время существования объекта StreamWriter.

write(object)

Записывает содержимое объекта, закодированное в поток.

writelines(list)

Записывает объединённую итерируемую последовательность строк в поток (возможно, повторно используя метод write()). Бесконечные или очень большие итерируемые последовательности не поддерживаются. Стандартные кодировки байты-в-байты не поддерживают этот метод.

reset()

Сбрасывает буферы кодировщика, используемые для хранения внутреннего состояния.

Вызов этого метода должен гарантировать, что данные на выходе находятся в чистом состоянии, которое позволяет добавлять новые свежие данные без необходимости повторного сканирования всего потока для восстановления состояния.

Помимо перечисленных методов, StreamWriter также должен унаследовать все остальные методы и атрибуты от базового потока.

Объекты StreamReader

Класс StreamReader является подклассом Codec и определяет следующие методы, которые должен определять каждый читатель потока, чтобы быть совместимым с реестром кодировок Python.

class codecs.StreamReader(stream, errors='strict')

Конструктор экземпляра StreamReader.

Все объекты чтения потока должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только определённые здесь используются реестром кодировок Python.

Аргумент stream должен быть объектом типа файл, открытым для чтения текстовых или двоичных данных, как это подходит для конкретной кодировки.

Объект StreamReader может реализовывать различные схемы обработки ошибок, предоставляя ключевой аргумент errors. См. Обработчики ошибок для стандартных обработчиков ошибок, которые может поддерживать кодировка базового потока.

Аргумент errors будет присвоен атрибуту с тем же именем. Присвоение этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок во время существования объекта StreamReader объекта.

Множество допустимых значений для аргумента errors можно расширить с помощью register_error().

read(size=-1, chars=-1, firstline=False)

Декодирует данные из потока и возвращает результирующий объект.

Аргумент chars указывает количество декодированных точек кода или байтов для возврата. Метод read() никогда не вернёт больше данных, чем запрошено, но он может вернуть меньше, если доступно недостаточно данных.

Аргумент size указывает приблизительное максимальное количество кодированных байтов или точек кода для чтения для декодирования. Декодер может изменить это значение по своему усмотрению. Значение по умолчанию -1 означает чтение и декодирование максимально возможного количества. Этот параметр предназначен для предотвращения декодирования огромных файлов за один шаг.

Флаг firstline указывает, что достаточно будет вернуть только первую строку, если есть ошибки декодирования в последующих строках.

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

readline(size=None, keepends=True)

Читает одну строку из входного потока и возвращает декодированные данные.

size, если задан, передаётся как аргумент size методу read() потока.

Если keepends ложно, окончания строк будут удалены из возвращаемых строк.

readlines(sizehint=None, keepends=True)

Читает все доступные строки из входного потока и возвращает их в виде списка строк.

Окончания строк реализуются с помощью метода decode() кодировщика и включаются в записи списка, если keepends истинно.

sizehint, если задан, передаётся как аргумент size методу read() потока.

reset()

Сбрасывает буферы кодировщика, используемые для хранения внутреннего состояния.

Обратите внимание, что никаких перемещений потока не должно происходить. Этот метод в первую очередь предназначен для восстановления после ошибок декодирования.

Помимо перечисленных методов, StreamReader также должен унаследовать все остальные методы и атрибуты от базового потока.

Объекты StreamReaderWriter

Класс StreamReaderWriter — это удобный класс, позволяющий оборачивать потоки, которые работают в режимах чтения и записи.

Конструкции таких объектов организованы так, что можно использовать функции-фабрики, возвращаемые функцией lookup(), для создания экземпляров.

class codecs.StreamReaderWriter(stream, Reader, Writer, errors='strict')

Создаёт экземпляр StreamReaderWriter. stream должен быть объектом типа файл. Reader и Writer должны быть функциями-фабриками или классами, предоставляющими интерфейс StreamReader и StreamWriter соответственно. Обработка ошибок выполняется так же, как определено для объектов чтения и записи потоков.

Экземпляры StreamReaderWriter определяют объединённые интерфейсы классов StreamReader и StreamWriter. Они наследуют все остальные методы и атрибуты от базового потока.

Объекты StreamRecoder

Класс StreamRecoder преобразует данные из одного кодирования в другое, что может быть полезно при работе с различными кодировочными средами.

Для создания экземпляра можно использовать фабричные функции, возвращаемые функцией lookup().

class codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors='strict')

Создает экземпляр StreamRecoder, реализующий двустороннее преобразование: методы encode и decode работают на переднем плане — с данными, видимыми коду, вызывающему read() и write(), а методы Reader и Writer работают на заднем плане — с данными в потоке stream.

Эти объекты можно использовать для прозрачного преобразования кодировок, например, из Latin-1 в UTF-8 и обратно.

Аргумент stream должен быть объектом, похожим на файл.

Аргументы encode и decode должны соответствовать интерфейсу Codec. Reader и Writer должны быть фабричными функциями или классами, предоставляющими объекты интерфейса StreamReader и StreamWriter соответственно.

Обработка ошибок выполняется так же, как и для читателей и писателей потоков.

Экземпляры StreamRecoder определяют объединённый интерфейс классов StreamReader и StreamWriter. Они наследуют все другие методы и атрибуты от основного потока.

Кодирования и Unicode

Строки хранятся внутри как последовательности кодовых точек в диапазоне U+0000–U+10FFFF. (См. PEP 393 для получения более подробной информации об реализации.) После использования объекта строки за пределами процессора и памяти возникает проблема с порядком байтов и способом хранения этих массивов в виде байтов. Как и в случае с другими кодеками, сериализация строки в последовательность байтов известна как кодирование, а восстановление строки из последовательности байтов — как декодирование. Существует множество различных кодеков для сериализации текста, которые коллективно называются кодировками текста.

Простейшая кодировка текста (называемая 'latin-1' или 'iso-8859-1' ) сопоставляет кодовые точки 0–255 байтам 0x0–0xff, что означает, что объект строки, содержащий кодовые точки выше U+00FF, не может быть закодирован с помощью этого кодека. В этом случае будет возбуждено исключение UnicodeEncodeError, имеющее вид (хотя детали сообщения об ошибке могут отличаться): UnicodeEncodeError: 'latin-1' codec can't encode character '\u1234' in position 3: ordinal not in range(256).

Существует ещё одна группа кодировок (так называемые кодировки charmap), которые выбирают другой подмножество всех кодовых точек Unicode и способ сопоставления этих кодовых точек байтам 0x0–0xff. Чтобы увидеть, как это делается, достаточно открыть, например, encodings/cp1252.py (кодировка, используемая в основном в Windows). Существует строковая константа с 256 символами, показывающая, какой символ сопоставлен с каким значением байта.

Все эти кодировки могут закодировать только 256 из 1114112 кодовых точек, определённых в Unicode. Простой и прямой способ хранения каждой кодовой точки Unicode — хранить каждую кодовую точку как четыре последовательных байта. Есть два варианта: хранить байты в порядке big endian или little endian. Эти две кодировки называются UTF-32-BE и UTF-32-LE соответственно. Их недостатком является то, что если, например, вы используете UTF-32-BE на машине с little endian, вам всегда придётся переставлять байты при кодировании и декодировании. UTF-32 избегает этой проблемы: байты всегда будут в естественном порядке байтов. Однако, если эти байты будут прочитаны процессором с другим порядком байтов, то байты придётся переставить. Для того, чтобы можно было определить порядок байтов последовательности байтов UTF-16 или UTF-32, существует так называемый BOM («Byte Order Mark»). Это символ Unicode U+FEFF. Этот символ может быть добавлен в начало каждой последовательности байтов UTF-16 или UTF-32. Переставленная версия этого символа (0xFFFE) является недопустимым символом, который может не появляться в тексте Unicode. Таким образом, если первый символ в последовательности байтов UTF-16 или UTF-32 оказывается U+FFFE, то байты нужно переставить при декодировании. К сожалению, символ U+FEFF имел второе назначение как ZERO WIDTH NO-BREAK SPACE: символ без ширины, не позволяющий разделять слова. Он может, например, использоваться для подсказок алгоритму лигатур. С Unicode 4.0 использование U+FEFF в качестве ZERO WIDTH NO-BREAK SPACE было устаревшим (с U+2060 (WORD JOINER) взявшим на себя эту роль). Тем не менее, программное обеспечение Unicode по-прежнему должно уметь обрабатывать U+FEFF в обоих ролях: как BOM, это устройство для определения схемы хранения закодированных байтов, и исчезает после декодирования последовательности байтов в строку; как ZERO WIDTH NO-BREAK SPACE это обычный символ, который будет декодирован как любой другой.

Существует ещё одна кодировка, способная кодировать весь диапазон символов Unicode: UTF-8. UTF-8 — это 8-битная кодировка, поэтому проблем с порядком байтов в UTF-8 нет. Каждый байт в последовательности байтов UTF-8 состоит из двух частей: битов маркера (самые старшие биты) и битов полезной нагрузки. Бит маркера — это последовательность от нуля до четырёх 1 битов, за которой следует 0 бит. Символы Unicode кодируются таким образом (x — биты полезной нагрузки, которые, соединённые вместе, дают символ Unicode):

Диапазон

Кодирование

U-00000000 … U-0000007F

0xxxxxxx

U-00000080 … U-000007FF

110xxxxx 10xxxxxx

U-00000800 … U-0000FFFF

1110xxxx 10xxxxxx 10xxxxxx

U-00010000 … U-0010FFFF

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Наименее значительный бит символа Unicode — это самый правый бит x.

Поскольку UTF-8 — это 8-битная кодировка, BOM не требуется, и любой символ U+FEFF в декодированной строке (даже если это первый символ) обрабатывается как ZERO WIDTH NO-BREAK SPACE.

Без внешней информации невозможно надёжно определить, какая кодировка использовалась для кодирования строки. Каждая кодировка charmap может декодировать любую случайную последовательность байтов. Однако это невозможно с UTF-8, так как последовательности байтов UTF-8 имеют структуру, которая не позволяет произвольных последовательностей байтов. Чтобы повысить надёжность определения кодировки UTF-8, Microsoft изобрели вариант UTF-8 (который Python называет "utf-8-sig" ) для своей программы Блокнот: перед записью любого символа Unicode в файл записывается закодированный в UTF-8 BOM (в виде такой последовательности байтов: 0xef, 0xbb, 0xbf). Поскольку маловероятно, что любой файл, закодированный с помощью charmap, начнётся с этих значений байтов (которые, например, в iso-8859-1 отображаются как), это повышает вероятность того, что кодировка utf-8-sig может быть правильно угадана из последовательности байтов. Таким образом, здесь BOM не используется для определения порядка байтов, используемого для создания последовательности байтов, а как подпись, которая помогает угадать кодировку. При кодировании кодек utf-8-sig запишет 0xef, 0xbb, 0xbf в качестве первых трёх байтов в файл. При декодировании utf-8-sig пропустит эти три байта, если они появятся в файле как первые три байта. В UTF-8 использование BOM не рекомендуется и его следует вообще избегать.

Стандартные кодировки

В Python имеется ряд встроенных кодеков, реализованных либо как функции C, либо с помощью словарей в качестве таблиц сопоставления. В следующей таблице перечислены кодеки по имени, вместе с некоторыми общими псевдонимами и языками, для которых кодировка, вероятно, используется. Ни список псевдонимов, ни список языков не претендуют на полноту. Обратите внимание, что варианты написания, которые различаются только регистром или используют дефис вместо нижнего подчёркивания, также являются допустимыми псевдонимами; поэтому, например, 'utf-8' является допустимым псевдонимом для кодека 'utf_8'.

Подробность реализации CPython: Некоторые распространённые кодировки могут обойти механизм поиска кодеков для повышения производительности. Эти возможности оптимизации распознаются CPython только для ограниченного набора (регистронезависимых) псевдонимов: utf-8, utf8, latin-1, latin1, iso-8859-1, iso8859-1, mbcs (только Windows), ascii, us-ascii, utf-16, utf16, utf-32, utf32, и то же самое с использованием нижнего подчёркивания вместо дефиса. Использование альтернативных псевдонимов для этих кодировок может привести к замедлению выполнения.

Изменено в версии 3.6: Возможность оптимизации распознана для us-ascii.

Многие наборы символов поддерживают одни и те же языки. Они различаются по отдельным символам (например, по наличию или отсутствию символа «ЕВРО»), и по назначению символов в кодовых позициях. В частности, для европейских языков обычно существуют следующие варианты:

  • набор символов ISO 8859
  • страница кодов Microsoft Windows, которая обычно основана на наборе символов 8859, но заменяет управляющие символы дополнительными графическими символами
  • страница кодов IBM EBCDIC
  • страница кодов IBM PC, совместимая с ASCII

Кодек

Псевдонимы

Языки

ascii

646, us-ascii

Английский

big5

big5-tw, csbig5

Традиционный китайский

big5hkscs

big5-hkscs, hkscs

Традиционный китайский

cp037

IBM037, IBM039

Английский

cp273

273, IBM273, csIBM273

Немецкий

Добавлен в версии 3.4.

cp424

EBCDIC-CP-HE, IBM424

Иврит

cp437

437, IBM437

Английский

cp500

EBCDIC-CP-BE, EBCDIC-CP-CH, IBM500

Западная Европа

cp720

Арабский

cp737

Греческий

cp775

IBM775

Языки Балтии

cp850

850, IBM850

Западная Европа

cp852

852, IBM852

Центральная и Восточная Европа

cp855

855, IBM855

Болгарский, Белорусский, Македонский, Русский, Сербский

cp856

Иврит

cp857

857, IBM857

Турецкий

cp858

858, IBM858

Западная Европа

cp860

860, IBM860

Португальский

cp861

861, CP-IS, IBM861

Исландский

cp862

862, IBM862

Иврит

cp863

863, IBM863

Канадский

cp864

IBM864

Арабский

cp865

865, IBM865

Датский, Норвежский

cp866

866, IBM866

Русский

cp869

869, CP-GR, IBM869

Греческий

cp874

Тайский

cp875

Греческий

cp932

932, ms932, mskanji, ms-kanji

Японский

cp949

949, ms949, uhc

Корейский

cp950

950, ms950

Традиционный китайский

cp1006

Урду

cp1026

ibm1026

Турецкий

cp1125

1125, ibm1125, cp866u, ruscii

Украинский

Добавлен в версии 3.4.

cp1140

ibm1140

Западная Европа

cp1250

windows-1250

Центральная и Восточная Европа

cp1251

windows-1251

Болгарский, Белорусский, Македонский, Русский, Сербский

cp1252

windows-1252

Западная Европа

cp1253

windows-1253

Греческий

cp1254

windows-1254

Турецкий

cp1255

windows-1255

Иврит

cp1256

windows-1256

Арабский

cp1257

windows-1257

Языки Балтии

cp1258

windows-1258

Вьетнамский

euc_jp

eucjp, ujis, u-jis

Японский

euc_jis_2004

jisx0213, eucjis2004

Японский

euc_jisx0213

eucjisx0213

Японский

euc_kr

euckr, korean, ksc5601, ks_c-5601, ks_c-5601-1987, ksx1001, ks_x-1001

Корейский

gb2312

chinese, csiso58gb231280, euc-cn, euccn, eucgb2312-cn, gb2312-1980, gb2312-80, iso-ir-58

Упрощённый китайский

gbk

936, cp936, ms936

Объединённый китайский

gb18030

gb18030-2000

Объединённый китайский

hz

hzgb, hz-gb, hz-gb-2312

Упрощённый китайский

iso2022_jp

csiso2022jp, iso2022jp, iso-2022-jp

Японский

iso2022_jp_1

iso2022jp-1, iso-2022-jp-1

Японский

iso2022_jp_2

iso2022jp-2, iso-2022-jp-2

Японский, Корейский, Упрощённый китайский, Западная Европа, Греческий

iso2022_jp_2004

iso2022jp-2004, iso-2022-jp-2004

Японский

iso2022_jp_3

iso2022jp-3, iso-2022-jp-3

Японский

iso2022_jp_ext

iso2022jp-ext, iso-2022-jp-ext

Японский

iso2022_kr

csiso2022kr, iso2022kr, iso-2022-kr

Корейский

latin_1

iso-8859-1, iso8859-1, 8859, cp819, latin, latin1, L1

Западная Европа

iso8859_2

iso-8859-2, latin2, L2

Центральная и Восточная Европа

iso8859_3

iso-8859-3, latin3, L3

Эсперанто, Мальтийский

iso8859_4

iso-8859-4, latin4, L4

Языки Балтии

iso8859_5

iso-8859-5, cyrillic

Болгарский, Белорусский, Македонский, Русский, Сербский

iso8859_6

iso-8859-6, arabic

Арабский

iso8859_7

iso-8859-7, greek, greek8

Греческий

iso8859_8

iso-8859-8, hebrew

Иврит

iso8859_9

iso-8859-9, latin5, L5

Турецкий

iso8859_10

iso-8859-10, latin6, L6

Северные языки

iso8859_11

iso-8859-11, thai

Тайские языки

iso8859_13

iso-8859-13, latin7, L7

Языки Балтии

iso8859_14

iso-8859-14, latin8, L8

Келтские языки

iso8859_15

iso-8859-15, latin9, L9

Западная Европа

iso8859_16

iso-8859-16, latin10, L10

Юго-Восточная Европа

johab

cp1361, ms1361

Корейский

koi8_r

Русский

koi8_t

Таджикский

Добавлен в версии 3.5.

koi8_u

Украинский

kz1048

kz_1048, strk1048_2002, rk1048

Казахский

Добавлен в версии 3.5.

mac_cyrillic

maccyrillic

Болгарский, Белорусский, Македонский, Русский, Сербский

mac_greek

macgreek

Греческий

mac_iceland

maciceland

Исландский

mac_latin2

maclatin2, maccentraleurope, mac_centeuro

Центральная и Восточная Европа

mac_roman

macroman, macintosh

Западная Европа

mac_turkish

macturkish

Турецкий

ptcp154

csptcp154, pt154, cp154, cyrillic-asian

Казахский

shift_jis

csshiftjis, shiftjis, sjis, s_jis

Японский

shift_jis_2004

shiftjis2004, sjis_2004, sjis2004

Японский

shift_jisx0213

shiftjisx0213, sjisx0213, s_jisx0213

Японский

utf_32

U32, utf32

все языки

utf_32_be

UTF-32BE

все языки

utf_32_le

UTF-32LE

все языки

utf_16

U16, utf16

все языки

utf_16_be

UTF-16BE

все языки

utf_16_le

UTF-16LE

все языки

utf_7

U7, unicode-1-1-utf-7

все языки

utf_8

U8, UTF, utf8, cp65001

все языки

utf_8_sig

все языки

Изменено в версии 3.4: Кодировщики utf-16* и utf-32* больше не допускают кодирования суррогатных кодовых точек (U+D800–U+DFFF). Декодеры utf-32* больше не декодируют последовательности байтов, которые соответствуют суррогатным кодовым точкам.

Изменено в версии 3.8: cp65001 теперь является псевдонимом utf_8.

Уточнения кодировок Python

Ряд предопределенных кодеков специфичен для Python, поэтому их имена кодеков не имеют смысла вне Python. Эти кодеки перечислены в таблицах ниже, исходя из ожидаемых типов входных и выходных данных (обратите внимание, что, хотя кодировки текста являются наиболее распространенным случаем использования кодеков, базовая инфраструктура кодеков поддерживает произвольные преобразования данных, а не только кодировки текста). Для асимметричных кодеков указанный смысл описывает направление кодирования.

Кодировки текста

Следующие кодеки обеспечивают кодирование str в bytes и декодирование объектов типа bytes в str, аналогично кодировкам Unicode-текста.

Кодек

Псевдонимы

Значение

idna

Реализация RFC 3490, см. также encodings.idna. Поддерживается только errors='strict'.

mbcs

ansi, dbcs

Только Windows: Кодирует операнд в соответствии с кодовой страницей ANSI (CP_ACP).

oem

Только Windows: Кодирует операнд в соответствии с кодовой страницей OEM (CP_OEMCP).

Добавлена в версии 3.6.

palmos

Кодировка PalmOS 3.5.

punycode

Реализация RFC 3492. Состоятельные кодеки не поддерживаются.

raw_unicode_escape

Кодировка Latin-1 с \uXXXX и \UXXXXXXXX для других кодовых точек. Существующие обратные слэши никак не экранируются. Используется в протоколе Python pickle.

undefined

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

unicode_escape

Кодировка, подходящая в качестве содержимого литерала Unicode в коде Python, закодированном в ASCII, за исключением того, что кавычки не экранируются. Декодирование из исходного кода Latin-1. Обратите внимание, что Python исходный код по умолчанию использует UTF-8.

Изменено в версии 3.8: Кодек “unicode_internal” удалён.

Бинарные преобразования

Следующие кодеки обеспечивают бинарные преобразования: соответствие объектов типа bytes к bytes. Они не поддерживаются bytes.decode() (который генерирует только выходные данные str).

Кодек

Псевдонимы

Значение

Кодировщик/декодировщик

base64_codec [1]

base64, base_64

Преобразует операнд в многострочный MIME base64 (результат всегда включает завершающий '\n').

Изменено в версии 3.4: принимает любой объект типа bytes в качестве входных данных для кодирования и декодирования

base64.encodebytes() / base64.decodebytes()

bz2_codec

bz2

Сжимает операнд с помощью bz2.

bz2.compress() / bz2.decompress()

hex_codec

hex

Преобразует операнд в шестнадцатеричное представление с двумя цифрами на байт.

binascii.b2a_hex() / binascii.a2b_hex()

quopri_codec

quopri, quotedprintable, quoted_printable

Преобразует операнд в MIME quoted printable.

quopri.encode() с quotetabs=True / quopri.decode()

uu_codec

uu

Преобразует операнд с помощью uuencode.

uu.encode() / uu.decode() (Примечание: uu устарел.)

zlib_codec

zip, zlib

Сжимает операнд с помощью gzip.

zlib.compress() / zlib.decompress()

[1]

Помимо объектов типа bytes, 'base64_codec' также принимает ASCII-только экземпляры str для декодирования

Добавлена в версии 3.2: Восстановление бинарных преобразований.

Изменено в версии 3.4: Восстановление псевдонимов для бинарных преобразований.

Текстовые преобразования

Следующий кодек обеспечивает текстовое преобразование: соответствие str к str. Он не поддерживается str.encode() (который генерирует только выходные данные bytes).

Кодек

Псевдонимы

Значение

rot_13

rot13

Возвращает шифрование Цезаря операнда.

Добавлена в версии 3.2: Восстановление текстового преобразования rot_13.

Изменено в версии 3.4: Восстановлен псевдоним rot13.

encodings.idna — Международные доменные имена в приложениях

Этот модуль реализует RFC 3490 (Международные доменные имена в приложениях) и RFC 3492 (Nameprep: Профиль Stringprep для международных доменных имён (IDN)). Он основан на кодировке punycode и stringprep.

Если вам требуется стандарт IDNA 2008 из RFC 5891 и RFC 5895, используйте сторонний модуль idna.

Эти RFC вместе определяют протокол для поддержки символов, отличных от ASCII, в доменных именах. Доменное имя, содержащее символы, отличные от ASCII (например, www.Alliancefrançaise.nu), преобразуется в совместимую с ASCII кодировку (ACE, например www.xn--alliancefranaise-npb.nu). Форма ACE доменного имени затем используется во всех местах, где произвольные символы не допускаются протоколом, таких как запросы DNS, поля HTTP Host и т. д. Это преобразование выполняется в приложении; если возможно, незаметно для пользователя: приложение должно прозрачно преобразовывать метки Unicode доменных имён в IDNA в сети и преобразовывать метки ACE обратно в Unicode перед представлением их пользователю.

Python поддерживает это преобразование несколькими способами: кодек idna выполняет преобразование между Unicode и ACE, разделяя входную строку на метки на основе разделителей, определённых в разделе 3.1 RFC 3490 и преобразует каждую метку в ACE по мере необходимости, и наоборот, разделяет входную строку байтов на метки на основе разделителя . и преобразует любые найденные метки ACE в unicode. Кроме того, модуль socket прозрачно преобразует имена хостов Unicode в ACE, чтобы приложениям не нужно было беспокоиться о преобразовании имён хостов самим, когда они передают их модулю socket. Кроме того, модули, имеющие имена хостов в качестве параметров функций, такие как http.client и ftplib, принимают имена хостов Unicode (http.client затем также прозрачно отправляет имя хоста IDNA в поле Host, если вообще отправляет это поле).

При получении имён хостов из сети (например, при обратном поиске имён) автоматическое преобразование в Unicode не выполняется: приложения, желающие представить такие имена хостов пользователю, должны декодировать их в Unicode.

Модуль encodings.idna также реализует процедуру nameprep, которая выполняет определённые нормализации имён хостов для достижения регистронезависимости международных доменных имён и объединения похожих символов. Функции nameprep можно использовать напрямую, если это необходимо.

encodings.idna.nameprep(label)

Возвращает преобразованную версию label. Реализация в настоящее время предполагает запросы, поэтому AllowUnassigned имеет значение true.

encodings.idna.ToASCII(label)

Преобразование метки в ASCII, как указано в RFC 3490. UseSTD3ASCIIRules предполагается false.

encodings.idna.ToUnicode(label)

Преобразование метки в Unicode, как указано в RFC 3490.

encodings.mbcs — Кодировка ANSI Windows

Этот модуль реализует кодировку ANSI (CP_ACP).

Доступность: Windows.

Изменено в версии 3.2: До версии 3.2 аргумент errors игнорировался; 'replace' всегда использовался для кодирования, а 'ignore' — для декодирования.

Изменено в версии 3.3: Поддержка любого обработчика ошибок.

encodings.utf_8_sig — Кодировка UTF-8 с сигнатурой BOM

Этот модуль реализует вариант кодировки UTF-8. При кодировании в UTF-8 кодированную BOM будет добавлена в начало байтов. Для состоятельного кодировщика это выполняется только один раз (при первом записи в поток байтов). При декодировании необязательная кодированная BOM UTF-8 в начале данных будет пропущена.

© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/codecs.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API