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

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


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

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

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

Кодирует obj, используя кодек, зарегистрированный для encoding.

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

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

Декодирует obj, используя кодек, зарегистрированный для encoding.

Ошибки могут быть заданы для настройки желаемой схемы обработки ошибок. Обработчик ошибок по умолчанию имеет значение '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 Interface). Ожидается, что функции или методы будут работать в режиме без сохранения состояния.

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 указывает кодировку, которая будет использоваться для файла. Допускается любая кодировка, которая кодирует в байты и декодирует из них, а типы данных, поддерживаемые файловыми методами, зависят от используемого кодека.

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

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

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

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

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

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

Если параметр file_encoding не задан, то по умолчанию используется значение data_encoding.

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

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

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

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

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

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

Эта функция требует, чтобы кодек принимал 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

Эти константы определяют различные последовательности байтов, являясь метками порядка байтов в Unicode (спецификациями) для нескольких кодировок. Они используются в потоках данных 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. Остальные представляют спецификацию в кодировках 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.)

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

Ценность

Значение

'xmlcharrefreplace'

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

'namereplace'

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

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

Ценность

Кодеки

Значение

'surrogatepass'

utf-8, utf-16, utf-32, utf-16-быть, utf-16-le, utf-32-быть, 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'.

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

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

codecs.xmlcharrefreplace_errors(exception)

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

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

codecs.namereplace_errors(exception)

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

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

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

Кодирование и декодирование без учета состояния

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

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

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

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

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

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

decode(input, errors='strict')

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

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

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

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

В этой ситуации декодер должен быть способен обрабатывать входные данные нулевой длины и возвращать пустой объект выходного типа object.

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

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

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

Объекты инкрементального кодера

Класс 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 используется для декодирования входных данных в несколько этапов. Он определяет следующие методы, которые должен определить каждый инкрементальный декодер, чтобы быть совместимым с реестром кодеков 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 и определяет следующие методы, которые должен определить каждый stream reader для обеспечения совместимости с реестром кодеков 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 методу stream read().

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

readlines(sizehint=None, keepends=True)

Считайте все строки, доступные во входном потоке, и возвращайте их в виде списка строк.

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

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

reset()

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

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

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

Объекты StreamReaderWriter

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

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

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

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

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

Объекты записи потока

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

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

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

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

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

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

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

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

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

Кодировки и Unicode

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

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

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

Все эти кодировки могут кодировать только 256 из 1114112 кодовых точек, определенных в Unicode. Простой и понятный способ сохранить каждую кодовую точку Unicode - это сохранить каждую кодовую точку в виде четырех последовательных байт. Есть две возможности: хранить байты в порядке возрастания или в порядке убывания. Эти две кодировки называются UTF-32-BE и UTF-32-LE соответственно. Их недостаток заключается в том, что если, например, вы используете UTF-32-BE на машине с малым порядком порядковых номеров, вам всегда придется менять местами байты при кодировании и декодировании. UTF-32 позволяет избежать этой проблемы: байты всегда будут иметь естественный порядок порядковых номеров. Однако, когда эти байты считываются процессором с другим порядковым номером, байты должны быть заменены местами. Чтобы можно было определить последовательность байтов UTF-16 или UTF-32, существует так называемая спецификация («Метка порядка байтов»). Это символ Юникода U+FEFF. Этот символ может добавляться перед каждой последовательностью байтов UTF-16 или UTF-32. Версия этого символа с заменой байтов (0xFFFE) является недопустимым символом, который может не отображаться в тексте в Юникоде. Таким образом, когда первый символ в последовательности байтов 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 в обеих ролях: как спецификация, это устройство для определения структуры хранилища закодированных байтов, и оно исчезает, как только последовательность байтов декодируется в строку; как ZERO WIDTH NO-BREAK SPACE это обычный символ, который будет расшифрован, как и любой другой.

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

Диапазон

Кодирование

U-00000000U-0000007F

0хххххххх

U-00000080U-000007FF

110хххххх 10хххххх

U-00000800U-0000FFFF

1110ххххх 10хххххх 10ххххх

U-00010000U-0010FFFF

11110xxxx 10xxxxxx 10xxxxx 10xxxxxx

Младшим разрядом символа Unicode является крайний правый бит x.

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

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

ЛАТИНСКАЯ СТРОЧНАЯ БУКВА I С ДИАРЕЗОМ
ДВУХУГОЛЬНАЯ КАВЫЧКА, УКАЗЫВАЮЩАЯ ВПРАВО
ПЕРЕВЕРНУТЫЙ ВОПРОСИТЕЛЬНЫЙ ЗНАК

в iso-8859-1), это увеличивает вероятность того, что кодировка utf-8-sig может быть правильно угадана по последовательности байтов. Таким образом, здесь спецификация используется не для определения порядка байтов, используемого для генерации последовательности байтов, а в качестве подписи, которая помогает угадать кодировку. При кодировании кодек utf-8-sig запишет в файл 0xef, 0xbb, 0xbf в качестве первых трех байт. При декодировании utf-8-sig эти три байта будут пропущены, если они отображаются как первые три байта в файле. В UTF-8 использование спецификации не рекомендуется и, как правило, его следует избегать.

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

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

Детали реализации CPython: Некоторые распространенные кодировки позволяют обойти механизм поиска кодеков для повышения производительности. Эти оптимизации могут быть распознаны только с CPython для ограниченного набора (без учета регистра) псевдонимы: кодировку UTF-8, UTF-8, то латиница-1, latin1, а с ISO-8859-1, кодировка iso8859-1, многобайтовые кодировки (только для Windows), в кодировке ASCII, ASCII США, UTF-16, в формате UTF16, UTF-32, в кодировках utf32, и то же самое с помощью подчеркивания вместо тире. Использование альтернативных псевдонимов для этих кодировок может привести к замедлению выполнения.

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

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

  • набор кодов ISO 8859

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

  • кодовая страница IBM EBCDIC

  • кодовая страница IBM PC, совместимая с ASCII

Кодек

Псевдонимы

Языки

ASCII

646, us-ascii

Английский

большой 5

big5-tw, csbig5

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

большие 5hkscs

big5-гонконгские банки, гонконгские банки

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

cp037

IBM037, IBM039

Английский

cp273

273, IBM 273, 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, ms кандзи, ms-кандзи

Японский

cp949

949, ms949, uhc

Корейский

cp950

950, мс950

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

cp1006

Урду

cp1026

ibm1026

Турецкий

cp1125

1125, ibm 1125, cp866u, русский

Украинский

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

ср1140

ibm1140

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

cp1250

windows-1250

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

cp1251

windows-1251

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

cp1252

windows-1252

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

ср1253

windows-1253

Греческий

ср1254

windows-1254

Турецкий

cp1255

windows-1255

Еврей

cp1256

windows-1256

Арабский язык

cp1257

windows-1257

Балтийские языки

cp1258

windows-1258

Вьетнамский

euc_jp (электронный адрес)

европейский суд по правам человека, ujis, u-jis

Японский

euc_jis_2004

jisx0213, eucjis2004

Японский

euc_jisx0213

eucjisx0213

Японский

euc_kr (ес_кр)

европейский, корейский, ksc5601, ks_c-5601, ks_c-5601-1987, ksx1001, ks_x-1001

Корейский

gb2312

китайский, csiso58gb231280, euc-cn, euc cn, eucgb2312-cn, gb2312-1980, gb2312-80, iso-ir-58

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

гбк

936, cp936, ms936

Единый китайский язык

gb18030

gb18030-2000

Единый китайский язык

гц

гц гб, гц-гб, гц-гб-2312

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

iso2022_jp (стандарт 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 стандарт iso2022_jp_ext

iso2022jp-ext, iso-2022-jp-ext

Японский

iso2022jp-ext, iso-2022-jp-ext

iso2022jp-ext, iso-2022-jp-ext

Корейский

iso2022jp-ext, iso-2022-jp-ext

iso2022jp-ext, iso-2022-jp-ext

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

iso2022jp-ext, iso-2022-jp-ext

iso2022jp-ext, iso-2022-jp-ext

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

iso2022jp-ext, iso-2022-jp-ext

iso2022jp-ext, iso-2022-jp-ext

iso2022jp-ext, iso-2022-jp-ext

iso2022jp-ext, iso-2022-jp-ext

iso2022jp-ext, iso-2022-jp-ext

Балтийские языки

iso2022jp-ext, iso-2022-jp-ext

iso2022jp-ext, iso-2022-jp-ext

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

iso2022jp-ext, iso-2022-jp-ext

iso2022jp-ext, iso-2022-jp-ext

Арабский язык

iso2022jp-ext, iso-2022-jp-ext

iso2022jp-ext, iso-2022-jp-ext

Греческий

iso2022jp-ext, iso-2022-jp-ext

iso-8859-8, иврит

Еврей

iso8859_9

iso-8859-9, латин5, L5

Турецкий

iso8859_10 - код iso8859_10

iso-8859-10, латин6, L6

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

исо8859_11

iso-8859-11, тайский

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

исо8859_13

iso-8859-13, латиница 7, L7

Балтийские языки

исо8859_14

iso-8859-14, латиница 8, L8

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

iso8859_15 - стандарт iso8859_15

iso-8859-15, латина9, L9

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

iso8859_16 (код iso8859_16)

iso-8859-16, латинский10, L10

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

джохаб

джохаб

Корейский

джохаб

Русский

джохаб

джохаб

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

джохаб

Украинский

1048 тенге

kz_1048, strk1048_2002, rk1048

Казах

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

mac_cyrillic кириллица

макрокириллица

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

mac_greek - греческий

макгрик

Греческий

мак_икленд

макисландия

Исландский

мак_латина2

maclatin2, maccentraleurope, mac_centeuro

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

макро-роман

макромен, macintosh

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

мак_тюркский

мактуркийский

Турецкий

ptcp154

csptcp154, pt154, cp154, кириллица-азиатская

Казах

сдвиг_jis

csshiftjis, сдвиг jis, sjis, s_jis

Японский

сдвиг_jis_2004

смена jis 2004, sjis_2004, sjis2004

Японский

сдвиг_jisx0213

сдвиг jisx0213, 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, юникод-1-1-utf-7

все языки

код utf_8

U8, UTF, utf8, cp65001

все языки

код utf_8_sig

все языки

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

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

Специфичные для Python кодировки

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

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

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

Кодек

Псевдонимы

Значение

идна

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

мбк

ansi, dbcs

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

oem-производитель

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

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

ладонь

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

пунический код

Реализуйте RFC 3492. Кодеки с отслеживанием состояния не поддерживаются.

raw_unicode_escape уникальный код

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

не определено

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

unicode_escape - эскиз юникода

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

Изменено в версии 3.8: кодек «unicode_internal» удален.

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

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

Кодек

Псевдонимы

Значение

Кодер/декодер

base64_codec [#b64] базовый код [1]

база64, база_64

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

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

base64.encodebytes() / base64.decodebytes()

bz2_кодек

bz2

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

bz2.compress() / bz2.decompress()

шестнадцатеричный кодек

шестиугольный

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

binascii.b2a_hex() / binascii.a2b_hex()

quopri_codec код запроса

quopri, пригодный для печати в кавычках, quoted_printable

Преобразуйте операнд в формат MIME, заключенный в кавычки для печати.

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

uu_codec (пользовательский код)

ууу

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

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

zlib_codec - кодовый код

почтовый индекс, zlib

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

zlib.compress() / zlib.decompress()

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

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

Преобразование текста

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

Кодек

Псевдонимы

Значение

рот_13

рот13

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

Добавлено в версии 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 module.

Эти 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, разделяя входную строку на метки на основе символов-разделителей, определенных в section 3.1 of RFC 3490, и преобразуя каждую метку в ACE по мере необходимости, и наоборот, разделяя входную строку байтов в метки на основе разделителя . и преобразуя все найденные метки ACE в unicode. Кроме того, модуль socket прозрачно преобразует имена хостов в кодировке Unicode в ACE, так что приложениям не нужно беспокоиться о преобразовании имен хостов самим, когда они передают их в модуль socket. Кроме того, модули, которые имеют имена хостов в качестве функциональных параметров, такие как http.client и ftplib, принимают имена хостов в Юникоде (http.client затем также прозрачно отправляют имя хоста IDNA в Host). поле, если оно вообще отправляет это поле).

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

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

encodings.idna.nameprep(label)

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

encodings.idna.ToASCII(label)

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

encodings.idna.ToUnicode(label)

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

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

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

Availability: Окна.

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

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

encodings.utf_8_sig — Кодек UTF-8 с подписью спецификации

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

Вернуться на верх