Spec-Zone.ru › Python 3.13

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.charmap_build(string)

Возвращает отображение, подходящее для кодирования с помощью пользовательской однобайтовой кодировки. Получив str string длиной не более 256 символов, представляющую таблицу декодирования, возвращает либо компактный внутренний объект отображения EncodingMap, либо отображение dictionary кодовых позиций символов в значения байтов. При недопустимых входных данных вызывает TypeError.

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

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)

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

Примечание

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

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

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

Аргумент buffering имеет то же значение, что и для встроенной функции 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.

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

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

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

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

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

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

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

codecs.readbuffer_encode(buffer, errors=None, /)

Возвращает tuple, содержащий исходные байты buffer — объекта, совместимого с буфером, или str (перед обработкой преобразуется в UTF-8), — и их длину в байтах.

Аргумент errors игнорируется.

>>> codecs.readbuffer_encode(b"Zito")
(b'Zito', 4)

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

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

Эти константы определяют различные последовательности байтов — метки порядка байтов Unicode (BOM) для нескольких кодировок. Они используются в потоках данных UTF-16 и UTF-32 для указания порядка байтов, а в UTF-8 — в качестве сигнатуры Unicode. 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'

Заменяет escape-последовательностями \N{...}; текст в фигурных скобках — это свойство Name из базы данных символов Unicode. Реализовано в 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 будет вызван при кодировании и декодировании в случае ошибки, если в качестве параметра errors указано значение name.

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

Декодирование и преобразование работают аналогично, за исключением того, что обработчику передаётся 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'.

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

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

codecs.xmlcharrefreplace_errors(exception)

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

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

codecs.namereplace_errors(exception)

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

Некодируемый символ заменяется escape-последовательностью \N{...}. Набор символов в фигурных скобках — это свойство Name из базы данных символов Unicode. Например, строчная немецкая буква 'ß' будет преобразована в последовательность байтов \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, он передаётся как аргумент размера методу потока read().

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

readlines(sizehint=None, keepends=True)

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

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

Если указан параметр 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 — сохранять её в виде четырёх последовательных байтов. Возможны два варианта: хранить байты в порядке от старшего к младшему или от младшего к старшему. Эти две кодировки называются соответственно UTF-32-BE и UTF-32-LE. Их недостаток состоит в том, что, например, при использовании UTF-32-BE на машине с порядком байтов от младшего к старшему при кодировании и декодировании всегда придётся менять порядок байтов. UTF-32 позволяет избежать этой проблемы: байты всегда хранятся в естественном порядке байтов. Однако при чтении этих байтов процессором с другим порядком байтов их всё же придётся переставить. Чтобы определить порядок байтов последовательности байтов UTF-16 или UTF-32, используется так называемый BOM («маркер порядка байтов»). Это символ 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 в файл записывается BOM в кодировке UTF-8 (в виде последовательности байтов: 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, либо с помощью словарей в качестве таблиц сопоставления. В следующей таблице перечислены кодеки по имени, а также несколько распространённых псевдонимов и языки, для которых, вероятно, используется кодировка. Ни список псевдонимов, ни список языков не являются исчерпывающими. Обратите внимание: варианты написания, отличающиеся только регистром букв или использующие дефис вместо подчёркивания, также являются допустимыми псевдонимами, поскольку после нормализации с помощью normalize_encoding() они эквивалентны. Например, 'utf-8' — допустимый псевдоним кодека 'utf_8'.

Примечание

В таблице ниже перечислены наиболее распространённые псевдонимы; полный список см. в исходном файле aliases.py.

Особенность реализации 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, windows-31j

Японский

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 для остальных кодовых точек. Существующие обратные косые черты никак не экранируются. Используется в протоколе pickle Python.

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.

zlib_codec

zip, zlib

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

zlib.compress() / zlib.decompress()

[1]

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

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

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

Автономные функции кодеков

Следующие функции обеспечивают кодирование и декодирование, подобные функциям кодеков, но недоступны в качестве именованных кодеков через codecs.encode() или codecs.decode(). Они используются внутри системы (например, в pickle) и работают подобно кодеку string_escape, удалённому в Python 3.

codecs.escape_encode(input, errors=None)

Кодирует input с помощью escape-последовательностей. Аналогично тому, как repr() для байтов отображает экранированные значения байтов.

input должен быть объектом bytes.

Возвращает кортеж (output, length), где output — объект bytes, а length — количество обработанных байтов.

codecs.escape_decode(input, errors=None)

Декодирует input из escape-последовательностей обратно в исходные байты.

input должен быть объектом, подобным bytes.

Возвращает кортеж (output, length), где output — объект bytes, а length — количество обработанных байтов.

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

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

Кодек

Псевдонимы

Значение

rot_13

rot13

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

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

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

encodings — пакет кодировок

Этот модуль реализует следующие функции:

encodings.normalize_encoding(encoding)

Нормализует имя кодировки encoding.

При нормализации все неалфавитно-цифровые символы, кроме точки, используемой в именах пакетов Python, объединяются и заменяются одним символом подчёркивания; начальные и конечные подчёркивания удаляются. Например, '  -;#' становится '_'.

Обратите внимание: encoding должен состоять только из символов ASCII.

Примечание

Следующую функцию не следует использовать напрямую, за исключением целей тестирования; вместо неё следует использовать codecs.lookup().

encodings.search_function(encoding)

Выполняет поиск модуля кодека, соответствующего указанному имени кодировки encoding.

Сначала эта функция нормализует encoding с помощью normalize_encoding(), а затем ищет соответствующий псевдоним. Она пытается импортировать модуль кодека из пакета encodings, используя псевдоним или нормализованное имя. Если модуль найден и определяет допустимую функцию getregentry(), возвращающую объект codecs.CodecInfo, кодек кэшируется и возвращается.

Если модуль кодека определяет функцию getaliases(), все возвращённые псевдонимы регистрируются для дальнейшего использования.

Этот модуль реализует следующее исключение:

exception encodings.CodecRegistryError

Возникает, если кодек недействителен или несовместим.

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-запросах, полях Host HTTP и т. д. Это преобразование выполняется на уровне приложения; по возможности оно должно быть незаметно для пользователя: приложение должно прозрачно преобразовывать метки домена 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)

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

encodings.idna.ToASCII(label)

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

encodings.idna.ToUnicode(label)

Преобразует метку в Unicode согласно RFC 3490.

encodings.mbcs — кодовая страница Windows ANSI

Этот модуль реализует кодовую страницу 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, закодированный в UTF-8. Для кодека с состоянием это выполняется только один раз (при первой записи в байтовый поток). При декодировании необязательный BOM, закодированный в UTF-8 и расположенный в начале данных, пропускается.

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

Spec-Zone.ru

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