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 Стандартные кодировки:
Ценность |
Значение |
---|---|
|
Поднимите |
|
Игнорируйте искаженные данные и продолжайте работу без дальнейшего уведомления. Реализовано в |
|
Замените маркером замены. При кодировании используйте |
|
Замените управляющими последовательностями с обратной косой чертой. При кодировании используйте шестнадцатеричную форму кодовой точки Unicode с форматами |
|
При декодировании замените байт отдельным суррогатным кодом в диапазоне от |
Следующие обработчики ошибок применимы только к кодированию (в пределах text encodings):
Ценность |
Значение |
---|---|
|
Замените цифровую символьную ссылку XML/HTML, которая представляет собой десятичную форму кодовой точки Unicode в формате |
|
Замените escape-последовательности на |
Кроме того, следующий обработчик ошибок специфичен для данных кодеков:
Ценность |
Кодеки |
Значение |
---|---|---|
|
utf-8, utf-16, utf-32, utf-16-быть, utf-16-le, utf-32-быть, utf-32-le |
Разрешать кодирование и декодирование суррогатной кодовой точки ( |
Добавлено в версии 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+0000
–U+10FFFF
. (Более подробную информацию о реализации смотрите в разделе PEP 393). Как только строковый объект используется за пределами процессора и памяти, возникает проблема с порядковыми номерами и тем, как эти массивы хранятся в виде байтов. Как и в случае с другими кодеками, преобразование строки в последовательность байтов называется «кодированием», а воссоздание строки из последовательности байтов называется «декодированием». Существует множество различных кодеков для сериализации текста, которые в совокупности называются text encodings.
Простейшая текстовая кодировка (называемая '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
, существует так называемая спецификация («Метка порядка байтов»). Это символ Юникода 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 - это биты полезной нагрузки, которые при объединении дают символ Юникода).:
Диапазон |
Кодирование |
---|---|
|
0хххххххх |
|
110хххххх 10хххххх |
|
1110ххххх 10хххххх 10ххххх |
|
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+D800
–U+DFFF
). Декодеры utf-32* больше не декодируют последовательности байтов, соответствующие суррогатным кодовым точкам.
Изменено в версии 3.8: cp65001
теперь является псевдонимом utf_8
.
Специфичные для Python кодировки¶
Ряд предопределенных кодеков специфичен для Python, поэтому их названия кодеков не имеют значения за пределами Python. Они перечислены в таблицах ниже в зависимости от ожидаемых типов ввода и вывода (обратите внимание, что, хотя текстовые кодировки являются наиболее распространенным вариантом использования кодеков, базовая инфраструктура кодеков поддерживает произвольные преобразования данных, а не только текстовые кодировки). Для асимметричных кодеков указанное значение описывает направление кодирования.
Кодировки текста¶
Следующие кодеки обеспечивают кодирование от str
до bytes
и декодирование от bytes-like object до str
, аналогично кодировкам текста в Юникоде.
Кодек |
Псевдонимы |
Значение |
---|---|---|
идна |
Реализуйте RFC 3490, смотрите также |
|
мбк |
ansi, dbcs |
Только для Windows: Закодируйте операнд в соответствии с кодовой страницей ANSI (CP_ACP). |
oem-производитель |
Только для Windows: Закодируйте операнд в соответствии с кодовой страницей OEM (CP_EMCP). Добавлено в версии 3.6. |
|
ладонь |
Кодировка PalmOS 3.5. |
|
пунический код |
Реализуйте RFC 3492. Кодеки с отслеживанием состояния не поддерживаются. |
|
raw_unicode_escape уникальный код |
Кодировка Latin-1 с использованием |
|
не определено |
Генерирует исключение для всех преобразований, даже для пустых строк. Обработчик ошибок игнорируется. |
|
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 (результат всегда содержит завершающий символ Изменено в версии 3.4: принимает любые bytes-like object в качестве входных данных для кодирования и декодирования |
|
bz2_кодек |
bz2 |
Сожмите операнд с помощью bz2. |
|
шестнадцатеричный кодек |
шестиугольный |
Преобразуйте операнд в шестнадцатеричное представление с двумя цифрами на байт. |
|
quopri_codec код запроса |
quopri, пригодный для печати в кавычках, quoted_printable |
Преобразуйте операнд в формат MIME, заключенный в кавычки для печати. |
|
uu_codec (пользовательский код) |
ууу |
Преобразуйте операнд с помощью uuencode. |
|
zlib_codec - кодовый код |
почтовый индекс, zlib |
Сожмите операнд с помощью gzip. |
Добавлено в версии 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.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 в начале данных будет пропущена.