codecs
— Реестр кодеков и базовые классы¶
Исходный код: Lib/codecs.py.
Этот модуль определяет базовые классы для стандартных кодеков Python (кодеров и декодеров) и предоставляет доступ к внутреннему реестру кодеков Python, который управляет процессом поиска кодеков и обработки ошибок. Большинство стандартных кодеков - это text encodings, которые кодируют текст в байты (и декодируют байты в текст), но есть также кодеки, которые кодируют текст в текст и байты в байты. Пользовательские кодеки могут кодировать и декодировать между произвольными типами, но некоторые функции модуля ограничены для использования именно с text encodings или с кодеками, которые кодируют в bytes
.
Модуль определяет следующие функции для кодирования и декодирования с помощью любого кодека:
-
codecs.
encode
(obj, encoding='utf-8', errors='strict')¶ Кодирует obj, используя кодек, зарегистрированный для encoding.
Errors может быть задан для установки желаемой схемы обработки ошибок. Обработчик ошибок по умолчанию
'strict'
означает, что ошибки кодирования вызывают ошибкуValueError
(или более специфичный для кодека подкласс, напримерUnicodeEncodeError
). Дополнительную информацию об обработке ошибок кодеков см. в разделе Базовые классы кодеков.
-
codecs.
decode
(obj, encoding='utf-8', errors='strict')¶ Декодирует obj, используя кодек, зарегистрированный для encoding.
Errors может быть задан для установки желаемой схемы обработки ошибок. Обработчик ошибок по умолчанию
'strict'
означает, что ошибки декодирования вызывают ошибкуValueError
(или более специфичный для кодека подкласс, напримерUnicodeDecodeError
). Дополнительную информацию об обработке ошибок кодеков см. в разделе Базовые классы кодеков.
Полную информацию о каждом кодеке можно также найти напрямую:
-
codecs.
lookup
(encoding)¶ Находит информацию о кодеке в реестре кодеков Python и возвращает объект
CodecInfo
, как определено ниже.Сначала кодировки ищутся в кэше реестра. Если он не найден, сканируется список зарегистрированных функций поиска. Если объект
CodecInfo
не найден, выдается сообщениеLookupError
. В противном случае объектCodecInfo
сохраняется в кэше и возвращается вызывающей стороне.
-
class
codecs.
CodecInfo
(encode, decode, streamreader=None, streamwriter=None, incrementalencoder=None, incrementaldecoder=None, name=None)¶ Сведения о кодеке при поиске в реестре кодеков. Аргументы конструктора хранятся в одноименных атрибутах:
-
name
¶ Имя кодировки.
-
encode
¶ -
decode
¶ Функции кодирования и декодирования без статического режима. Это должны быть функции или методы, имеющие тот же интерфейс, что и методы
encode()
иdecode()
экземпляров Codec (см. Codec Interface). Ожидается, что эти функции или методы будут работать в режиме stateless.
-
incrementalencoder
¶ -
incrementaldecoder
¶ Классы или заводские функции инкрементных кодеров и декодеров. Они должны предоставлять интерфейс, определенный базовыми классами
IncrementalEncoder
иIncrementalDecoder
соответственно. Инкрементные кодеки могут поддерживать состояние.
-
streamwriter
¶ -
streamreader
¶ Классы или фабричные функции для записи и чтения потоков. Они должны предоставлять интерфейс, определенный базовыми классами
StreamWriter
иStreamReader
соответственно. Потоковые кодеки могут поддерживать состояние.
-
Чтобы упростить доступ к различным компонентам кодека, модуль предоставляет эти дополнительные функции, которые используют lookup()
для поиска кодека:
-
codecs.
getencoder
(encoding)¶ Находит кодек для заданной кодировки и возвращает его функцию кодирования.
Вызывает ошибку
LookupError
в случае, если кодировка не может быть найдена.
-
codecs.
getdecoder
(encoding)¶ Находит кодек для заданной кодировки и возвращает его функцию декодера.
Вызывает ошибку
LookupError
в случае, если кодировка не может быть найдена.
-
codecs.
getincrementalencoder
(encoding)¶ Находит кодек для заданной кодировки и возвращает его класс инкрементного кодера или фабричную функцию.
Вызывает ошибку
LookupError
в случае, если кодировка не может быть найдена или кодек не поддерживает инкрементный кодер.
-
codecs.
getincrementaldecoder
(encoding)¶ Находит кодек для заданной кодировки и возвращает его класс инкрементного декодера или фабричную функцию.
Вызывает ошибку
LookupError
в случае, если кодировка не может быть найдена или кодек не поддерживает инкрементный декодер.
-
codecs.
getreader
(encoding)¶ Находит кодек для заданной кодировки и возвращает его класс
StreamReader
или фабричную функцию.Вызывает ошибку
LookupError
в случае, если кодировка не может быть найдена.
-
codecs.
getwriter
(encoding)¶ Находит кодек для заданной кодировки и возвращает его класс
StreamWriter
или фабричную функцию.Вызывает ошибку
LookupError
в случае, если кодировка не может быть найдена.
Пользовательские кодеки становятся доступными при регистрации соответствующей функции поиска кодеков:
-
codecs.
register
(search_function)¶ Регистрация функции поиска кодека. Предполагается, что функции поиска принимают один аргумент, представляющий собой имя кодировки всеми строчными буквами с дефисами и пробелами, преобразованными в знаки подчеркивания, и возвращают объект
CodecInfo
. Если функция поиска не может найти заданную кодировку, она должна возвращатьNone
.Изменено в версии 3.9: Дефисы и пробелы преобразуются в подчеркивание.
-
codecs.
unregister
(search_function)¶ Снимите с регистрации функцию поиска кодеков и очистите кэш реестра. Если функция поиска не зарегистрирована, ничего не делайте.
Добавлено в версии 3.10.
Хотя встроенный модуль open()
и связанный с ним модуль io
являются рекомендуемым подходом для работы с кодированными текстовыми файлами, этот модуль предоставляет дополнительные служебные функции и классы, которые позволяют использовать более широкий спектр кодеков при работе с двоичными файлами:
-
codecs.
open
(filename, mode='r', encoding=None, errors='strict', buffering=- 1)¶ Открыть закодированный файл, используя заданный режим, и вернуть экземпляр
StreamReaderWriter
, обеспечивающий прозрачное кодирование/декодирование. По умолчанию используется режим'r'
, означающий открытие файла в режиме чтения.Примечание
Подлежащие кодированию файлы всегда открываются в двоичном режиме. Автоматическое преобразование
'\n'
при чтении и записи не производится. Аргумент mode может быть любым двоичным режимом, приемлемым для встроенной функцииopen()
;'b'
добавляется автоматически.encoding указывает кодировку, которая будет использоваться для файла. Допускается любая кодировка, которая кодирует в байты и декодирует из них, а типы данных, поддерживаемые методами файла, зависят от используемого кодека.
errors может быть задан для определения обработки ошибок. По умолчанию это значение равно
'strict'
, что приводит к появлению сообщенияValueError
в случае ошибки кодирования.buffering имеет то же значение, что и для встроенной функции
open()
. По умолчанию он равен -1, что означает, что будет использоваться размер буфера по умолчанию.
-
codecs.
EncodedFile
(file, data_encoding, file_encoding=None, errors='strict')¶ Возвращает экземпляр
StreamRecoder
, обернутую версию file, которая обеспечивает прозрачное транскодирование. Исходный файл закрывается, когда закрывается обернутая версия.Данные, записанные в обернутый файл, декодируются в соответствии с заданным data_encoding, а затем записываются в исходный файл в виде байтов с использованием file_encoding. Байты, считанные из исходного файла, декодируются в соответствии с file_encoding, а результат кодируется с помощью data_encoding.
Если file_encoding не указан, по умолчанию используется data_encoding.
errors может быть задан для определения обработки ошибок. По умолчанию это значение равно
'strict'
, что приводит к возникновению ошибки кодированияValueError
.
-
codecs.
iterencode
(iterator, encoding, errors='strict', **kwargs)¶ Использует инкрементный кодер для итеративного кодирования входных данных, предоставленных iterator. Эта функция представляет собой 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
¶ Эти константы определяют различные последовательности байтов, являясь метками порядка байтов Юникода (BOM) для нескольких кодировок. Они используются в потоках данных UTF-16 и UTF-32 для указания используемого порядка байт, а в UTF-8 - как сигнатура Юникода.
BOM_UTF16
- этоBOM_UTF16_BE
илиBOM_UTF16_LE
в зависимости от родного порядка байтов платформы,BOM
- псевдоним дляBOM_UTF16
,BOM_LE
дляBOM_UTF16_LE
иBOM_BE
дляBOM_UTF16_BE
. Остальные представляют BOM в кодировках UTF-8 и UTF-32.
Базовые классы кодеков¶
Модуль codecs
определяет набор базовых классов, которые определяют интерфейсы для работы с объектами кодеков, а также могут быть использованы в качестве основы для пользовательских реализаций кодеков.
Каждый кодек должен определить четыре интерфейса, чтобы его можно было использовать как кодек в Python: stateless encoder, stateless decoder, stream reader и stream writer. Читатель и писатель потоков обычно повторно используют кодер/декодер без статики для реализации файловых протоколов. Авторам кодеков также необходимо определить, как кодек будет обрабатывать ошибки кодирования и декодирования.
Обработчики ошибок¶
Для упрощения и стандартизации обработки ошибок кодеки могут реализовывать различные схемы обработки ошибок, принимая строковый аргумент errors:
>>> 'German ß, ♬'.encode(encoding='ascii', errors='backslashreplace')
b'German \\xdf, \\u266c'
>>> 'German ß, ♬'.encode(encoding='ascii', errors='xmlcharrefreplace')
b'German ß, ♬'
Следующие обработчики ошибок могут использоваться со всеми кодеками Python Стандартные кодировки:
Значение |
Значение |
---|---|
|
Поднять |
|
Игнорировать неправильно сформированные данные и продолжать работу без дальнейших уведомлений. Реализовано в |
|
Заменить маркером замены. При кодировании используйте |
|
Замените на обратные косые черты. При кодировании используйте шестнадцатеричную форму кодовой точки Юникода с форматами |
|
При декодировании замените байт индивидуальным суррогатным кодом в диапазоне от |
Следующие обработчики ошибок применимы только к кодировке (в пределах text encodings):
Значение |
Значение |
---|---|
|
Заменить на XML/HTML числовую ссылку на символ, которая является десятичной формой кодовой точки Unicode с форматом |
|
Замените escape-последовательностью |
Кроме того, следующий обработчик ошибок специфичен для данных кодеков:
Значение |
Кодеки |
Значение |
---|---|---|
|
utf-8, utf-16, utf-32, utf-16-be, utf-16-le, utf-32-be, 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, официальный REPLACEMENT CHARACTER) при ошибках декодирования.
-
codecs.
backslashreplace_errors
(exception)¶ Реализует обработку ошибок
'backslashreplace'
.Некорректные данные заменяются обратной косой чертой. При кодировании используйте шестнадцатеричную форму кодовой точки Юникода с форматами
\xhh
\uxxxx
\Uxxxxxxxx
. При декодировании используйте шестнадцатеричную форму значения байта с форматом\xhh
.Изменено в версии 3.5: Работает с декодированием и переводом.
-
codecs.
xmlcharrefreplace_errors
(exception)¶ Реализует обработку ошибок
'xmlcharrefreplace'
(только для кодирования внутри text encoding).Некодируемый символ заменяется соответствующим цифровым символом XML/HTML, который является десятичной формой кодовой точки Unicode с форматом
&#num;
.
-
codecs.
namereplace_errors
(exception)¶ Реализует обработку ошибок
'namereplace'
(только для кодирования внутри text encoding).Некодируемый символ заменяется управляющей последовательностью
\N{...}
. Набор символов, которые появляются в скобках, является свойством Name из базы данных символов Unicode. Например, немецкая строчная буква'ß'
будет преобразована в последовательность байтов\N{LATIN SMALL LETTER SHARP S}
.Добавлено в версии 3.5.
Нестационарное кодирование и декодирование¶
Базовый класс Codec
определяет эти методы, которые также определяют функциональные интерфейсы безэталонного кодера и декодера:
-
Codec.
encode
(input, errors='strict')¶ Кодирует объект вход и возвращает кортеж (выходной объект, потребляемая длина). Например, text encoding преобразует строковый объект в байтовый объект, используя определенную кодировку набора символов (например,
cp1252
илиiso-8859-1
).Аргумент errors определяет, какую обработку ошибок следует применять. По умолчанию используется обработка
'strict'
.Метод может не хранить состояние в экземпляре
Codec
. ИспользуйтеStreamWriter
для кодеков, которые должны хранить состояние, чтобы сделать кодирование эффективным.Кодер должен уметь обрабатывать входные данные нулевой длины и возвращать в этой ситуации пустой объект типа выходного объекта.
-
Codec.
decode
(input, errors='strict')¶ Декодирует объект вход и возвращает кортеж (выходной объект, потребляемая длина). Например, для text encoding декодирование преобразует байтовый объект, закодированный с использованием определенного набора символов, в строковый объект.
Для текстовых кодировок и кодеков «байт в байт», вход должен быть объектом байта или объектом, который предоставляет интерфейс буфера только для чтения - например, объекты буфера и файлы с отображением в памяти.
Аргумент errors определяет, какую обработку ошибок следует применять. По умолчанию используется обработка
'strict'
.Метод может не хранить состояние в экземпляре
Codec
. ИспользуйтеStreamReader
для кодеков, которые должны хранить состояние, чтобы сделать декодирование эффективным.Декодер должен уметь обрабатывать входные данные нулевой длины и возвращать в этой ситуации пустой объект типа выходного объекта.
Инкрементное кодирование и декодирование¶
Классы IncrementalEncoder
и IncrementalDecoder
предоставляют базовый интерфейс для инкрементного кодирования и декодирования. Кодирование/декодирование входных данных выполняется не одним вызовом функции stateless encoder/decoder, а несколькими вызовами метода encode()
/decode()
инкрементального кодера/декодера. Инкрементный кодер/декодер отслеживает процесс кодирования/декодирования во время вызовов методов.
Объединенный вывод вызовов метода encode()
/decode()
является таким же, как если бы все одиночные входы были объединены в один, и этот вход был закодирован/декодирован с помощью кодера/декодера stateless.
Объекты инкрементального энкодера¶
Класс IncrementalEncoder
используется для кодирования входного сигнала в несколько этапов. Он определяет следующие методы, которые должен определить каждый инкрементный кодер, чтобы быть совместимым с реестром кодеков Python.
-
class
codecs.
IncrementalEncoder
(errors='strict')¶ Конструктор для экземпляра
IncrementalEncoder
.Все инкрементные кодировщики должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только те, которые определены здесь, используются реестром кодеков Python.
В
IncrementalEncoder
можно реализовать различные схемы обработки ошибок, предоставив аргумент ключевого слова errors. Возможные значения см. в Обработчики ошибок.Аргумент errors будет присвоен одноименному атрибуту. Присвоение этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок во время жизни объекта
IncrementalEncoder
.-
encode
(object, final=False)¶ Кодирует объект (с учетом текущего состояния кодера) и возвращает полученный закодированный объект. Если это последний вызов
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)¶ Декодирует объект (с учетом текущего состояния декодера) и возвращает полученный декодированный объект. Если это последний вызов
decode()
, то final должно быть true (по умолчанию false). Если final равно true, декодер должен полностью декодировать входные данные и очистить все буферы. Если это невозможно (например, из-за неполной последовательности байтов в конце входных данных), он должен инициировать обработку ошибок, как в случае stateless (что может вызвать исключение).
-
reset
()¶ Сброс декодера в исходное состояние.
-
getstate
()¶ Возвращает текущее состояние декодера. Это должен быть кортеж из двух элементов, первым из которых должен быть буфер, содержащий еще не декодированный вход. Второй должен быть целым числом и может быть дополнительной информацией о состоянии. (Реализация должна убедиться, что
0
является наиболее распространенной дополнительной информацией о состоянии). Если эта дополнительная информация о состоянии равна0
, то должна быть возможность перевести декодер в состояние, в котором нет буферизованного входа и0
в качестве дополнительной информации о состоянии, так что подача ранее буферизованного входа на декодер возвращает его в предыдущее состояние, не производя никакого вывода. (Дополнительная информация о состоянии, которая сложнее целых чисел, может быть преобразована в целое число путем маршалинга/пикинга информации и кодирования байтов полученной строки в целое число).
-
setstate
(state)¶ Установите состояние декодера в state. state должно быть состоянием декодера, возвращаемым командой
getstate()
.
-
Кодирование и декодирование потоков¶
Классы StreamWriter
и StreamReader
предоставляют общие рабочие интерфейсы, которые можно легко использовать для реализации новых подмодулей кодирования. Пример того, как это делается, смотрите в encodings.utf_8
.
Объекты StreamWriter¶
Класс StreamWriter
является подклассом класса Codec
и определяет следующие методы, которые должны быть определены каждым писателем потока, чтобы быть совместимыми с реестром кодеков Python.
-
class
codecs.
StreamWriter
(stream, errors='strict')¶ Конструктор для экземпляра
StreamWriter
.Все программы записи потоков должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только те, которые определены здесь, используются реестром кодеков Python.
Аргумент stream должен быть файлоподобным объектом, открытым для записи текстовых или двоичных данных, в зависимости от конкретного кодека.
StreamWriter
может реализовывать различные схемы обработки ошибок, предоставляя аргумент ключевого слова errors. Смотрите Обработчики ошибок для стандартных обработчиков ошибок, которые может поддерживать базовый потоковый кодек.Аргумент errors будет присвоен одноименному атрибуту. Присвоение этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок во время жизни объекта
StreamWriter
.-
write
(object)¶ Записывает содержимое объекта в закодированном виде в поток.
-
writelines
(list)¶ Записывает конкатенированную итерацию строк в поток (возможно, повторно используя метод
write()
). Бесконечные или очень большие итерации не поддерживаются. Стандартные кодеки «байт в байт» не поддерживают этот метод.
-
reset
()¶ Сброс буферов кодека, используемых для сохранения внутреннего состояния.
Вызов этого метода должен гарантировать, что данные на выходе будут переведены в чистое состояние, позволяющее добавлять новые свежие данные без необходимости повторного сканирования всего потока для восстановления состояния.
-
В дополнение к вышеуказанным методам, StreamWriter
должен также наследовать все остальные методы и атрибуты от базового потока.
Объекты StreamReader¶
Класс StreamReader
является подклассом класса Codec
и определяет следующие методы, которые должен определить каждый читатель потока, чтобы быть совместимым с реестром кодеков Python.
-
class
codecs.
StreamReader
(stream, errors='strict')¶ Конструктор для экземпляра
StreamReader
.Все устройства чтения потоков должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только те, которые определены здесь, используются реестром кодеков Python.
Аргумент stream должен быть файлоподобным объектом, открытым для чтения текстовых или двоичных данных, в зависимости от конкретного кодека.
StreamReader
может реализовывать различные схемы обработки ошибок, предоставляя аргумент ключевого слова errors. Смотрите Обработчики ошибок для стандартных обработчиков ошибок, которые может поддерживать базовый потоковый кодек.Аргумент errors будет присвоен одноименному атрибуту. Присвоение этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок во время жизни объекта
StreamReader
.Набор допустимых значений для аргумента errors может быть расширен с помощью
register_error()
.-
read
(size=- 1, chars=- 1, firstline=False)¶ Декодирует данные из потока и возвращает полученный объект.
Аргумент chars указывает количество возвращаемых декодированных кодовых точек или байтов. Метод
read()
никогда не вернет больше данных, чем запрошено, но может вернуть меньше, если данных недостаточно.Аргумент size указывает приблизительное максимальное количество закодированных байтов или точек кода, которые необходимо считать для декодирования. Декодер может изменять этот параметр по своему усмотрению. Значение по умолчанию -1 означает, что нужно считывать и декодировать как можно больше. Этот параметр предназначен для предотвращения необходимости декодирования огромных файлов за один шаг.
Флаг firstline указывает, что будет достаточно вернуть только первую строку, если на последующих строках возникли ошибки декодирования.
Метод должен использовать стратегию жадного чтения, что означает, что он должен прочитать столько данных, сколько разрешено в рамках определения кодировки и заданного размера, например, если в потоке доступны необязательные окончания кодировки или маркеры состояния, они тоже должны быть прочитаны.
-
readline
(size=None, keepends=True)¶ Считывание одной строки из входного потока и возврат декодированных данных.
size, если задан, передается в качестве аргумента size методу
read()
потока.Если keepends равно false, то из возвращаемых строк будут удалены окончания строк.
-
readlines
(sizehint=None, keepends=True)¶ Прочитать все строки, имеющиеся во входном потоке, и вернуть их в виде списка строк.
Окончания строк реализуются с помощью метода кодека
decode()
и включаются в записи списка, если keepends равно true.sizehint, если задан, передается как аргумент size методу потока
read()
.
-
reset
()¶ Сброс буферов кодека, используемых для сохранения внутреннего состояния.
Обратите внимание, что не должно происходить перепозиционирования потока. Этот метод в первую очередь предназначен для восстановления после ошибок декодирования.
-
В дополнение к вышеуказанным методам, StreamReader
должен также наследовать все остальные методы и атрибуты от базового потока.
Объекты StreamReaderWriter¶
StreamReaderWriter
- это класс удобства, позволяющий обернуть потоки, которые работают как в режиме чтения, так и в режиме записи.
Конструкция такова, что для построения экземпляра можно использовать фабричные функции, возвращаемые функцией lookup()
.
-
class
codecs.
StreamReaderWriter
(stream, Reader, Writer, errors='strict')¶ Создает экземпляр
StreamReaderWriter
. stream должен быть файлоподобным объектом. Reader и Writer должны быть фабричными функциями или классами, предоставляющими интерфейсStreamReader
иStreamWriter
соответственно. Обработка ошибок производится так же, как определено для читателей и писателей потока.
Экземпляры StreamReaderWriter
определяют комбинированные интерфейсы классов StreamReader
и StreamWriter
. Все остальные методы и атрибуты они наследуют от базового потока.
Объекты StreamRecoder¶
StreamRecoder
переводит данные из одной кодировки в другую, что иногда полезно при работе с различными кодировками.
Конструкция такова, что для построения экземпляра можно использовать фабричные функции, возвращаемые функцией lookup()
.
-
class
codecs.
StreamRecoder
(stream, encode, decode, Reader, Writer, errors='strict')¶ Создает экземпляр
StreamRecoder
, который реализует двустороннее преобразование: encode и decode работают на фронтенде - данные, видимые коду, вызывающемуread()
иwrite()
, а Reader и Writer работают на бэкенде - данные в stream.Вы можете использовать эти объекты для выполнения прозрачных перекодировок, например, из Latin-1 в UTF-8 и обратно.
Аргумент stream должен быть файлоподобным объектом.
Аргументы encode и decode должны соответствовать интерфейсу
Codec
. Reader и Writer должны быть фабричными функциями или классами, предоставляющими объекты интерфейсаStreamReader
иStreamWriter
соответственно.Обработка ошибок выполняется так же, как это определено для читателей и писателей потока.
Экземпляры StreamRecoder
определяют комбинированные интерфейсы классов StreamReader
и StreamWriter
. Все остальные методы и атрибуты они наследуют от базового потока.
Кодировки и Юникод¶
Строки хранятся внутри как последовательности кодовых точек в диапазоне 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. Простой и понятный способ хранения каждой кодовой точки Юникода - это хранение каждой кодовой точки в виде четырех последовательных байтов. Есть две возможности: хранить байты в порядке big endian или в порядке little endian. Эти две кодировки называются UTF-32-BE
и UTF-32-LE
соответственно. Их недостатком является то, что если, например, вы используете UTF-32-BE
на машине с little endian, вам всегда придется менять местами байты при кодировании и декодировании. UTF-32
позволяет избежать этой проблемы: байты всегда будут в естественном конечном числе. Когда эти байты считываются процессором с другой эндианальностью, то байты приходится менять местами. Чтобы иметь возможность определить конечность последовательности байтов UTF-16
или UTF-32
, существует так называемый BOM («Byte Order Mark»). Это символ Юникода U+FEFF
. Этот символ может быть добавлен к каждой последовательности байтов UTF-16
или UTF-32
. Версия этого символа (0xFFFE
), замененная байтами, является недопустимым символом, который не может появляться в тексте Unicode. Поэтому, когда первый символ в последовательности байтов UTF-16
или UTF-32
оказывается U+FFFE
, при декодировании необходимо поменять местами байты. К сожалению, символ U+FEFF
имеет второе назначение как ZERO WIDTH NO-BREAK SPACE
: символ, не имеющий ширины и не позволяющий разделить слово. Он может, например, использоваться для подсказки алгоритму лигатуры. В версии Unicode 4.0 использование U+FEFF
в качестве ZERO WIDTH NO-BREAK SPACE
было отменено (эту роль взяли на себя U+2060
(WORD JOINER
)). Тем не менее, программное обеспечение Unicode по-прежнему должно уметь работать с U+FEFF
в обеих ролях: как BOM это устройство для определения схемы хранения закодированных байтов, которое исчезает после декодирования последовательности байтов в строку; как ZERO WIDTH NO-BREAK SPACE
это обычный символ, который будет декодирован как любой другой.
Существует еще одна кодировка, которая способна кодировать полный набор символов Unicode: UTF-8. UTF-8 - это 8-битная кодировка, что означает отсутствие проблем с порядком байтов в UTF-8. Каждый байт в последовательности байтов UTF-8 состоит из двух частей: маркерные биты (старшие биты) и биты полезной нагрузки. Биты маркера представляют собой последовательность от нуля до четырех битов 1
, за которыми следует бит 0
. Символы Юникода кодируются следующим образом (с x - биты полезной нагрузки, которые при объединении дают символ Юникода):
Диапазон |
Кодирование |
---|---|
|
0xxxxxxx |
|
110xxxxx 10xxxxx |
|
1110xxx 10xxx 10xxx 10xxx |
|
11110xxx 10xxxxx 10xxxxx 10xxxxx 10xxxxx |
Наименьший значащий бит символа Unicode - это самый правый х-бит.
Поскольку UTF-8 является 8-битной кодировкой, BOM не требуется, и любой символ U+FEFF
в декодированной строке (даже если это первый символ) рассматривается как ZERO WIDTH NO-BREAK SPACE
.
Без внешней информации невозможно достоверно определить, какая кодировка была использована для кодирования строки. Каждая кодировка charmap может декодировать любую произвольную последовательность байтов. Однако это невозможно в случае UTF-8, поскольку последовательности байтов UTF-8 имеют структуру, не допускающую произвольных последовательностей байтов. Чтобы повысить надежность обнаружения кодировки UTF-8, компания Microsoft изобрела вариант UTF-8 (который в Python называется "utf-8-sig"
) для своей программы Notepad: Перед записью в файл любого из символов Unicode записывается BOM в кодировке UTF-8 (которая в виде последовательности байтов выглядит так: 0xef
, 0xbb
, 0xbf
). Поскольку довольно маловероятно, что любой файл, закодированный в charmap, начинается с этих значений байтов (которые, например, отображаются на
ЛАТИНСКАЯ СТРОЧНАЯ БУКВА I С ДИЕРЕЗИСОМНАПРАВЛЕННАЯ ВПРАВО ДВОЙНАЯ УГЛОВАЯ КАВЫЧКАПЕРЕВЁРНУТЫЙ ВОПРОСИТЕЛЬНЫЙ ЗНАК
в iso-8859-1), это увеличивает вероятность того, что по последовательности байтов можно правильно определить кодировку utf-8-sig
. Таким образом, здесь BOM используется не для определения порядка байтов, использованного для генерации последовательности байтов, а в качестве сигнатуры, которая помогает угадать кодировку. При кодировании кодек utf-8-sig запишет в файл 0xef
, 0xbb
, 0xbf
в качестве первых трех байт. При декодировании utf-8-sig
пропустит эти три байта, если они появятся как первые три байта в файле. В UTF-8 использование BOM не рекомендуется и, как правило, его следует избегать.
Стандартные кодировки¶
Python поставляется с рядом встроенных кодеков, реализованных либо в виде функций языка Си, либо в виде словарей в качестве таблиц отображения. В следующей таблице перечислены кодеки по именам, а также несколько общих псевдонимов и языки, для которых, вероятно, используется кодировка. Ни список псевдонимов, ни список языков не являются исчерпывающими. Обратите внимание, что варианты написания, которые отличаются только регистром или используют дефис вместо подчеркивания, также являются допустимыми псевдонимами; поэтому, например, 'utf-8'
является допустимым псевдонимом для кодека 'utf_8'
.
CPython implementation detail: Некоторые распространенные кодировки могут обходить механизм поиска кодеков для повышения производительности. Эти возможности оптимизации распознаются CPython только для ограниченного набора (без учета регистра) псевдонимов: utf-8, utf8, latin-1, latin1, iso-8859-1, iso8859-1, mbcs (только для Windows), ascii, us-ascii, utf-16, utf16, utf16, utf-32, utf32, и то же самое с использованием подчеркивания вместо тире. Использование альтернативных псевдонимов для этих кодировок может привести к замедлению выполнения.
Изменено в версии 3.6: Возможность оптимизации признана для us-ascii.
Многие наборы символов поддерживают одни и те же языки. Они различаются по отдельным символам (например, поддерживается или нет знак EURO), а также по назначению символов в кодовых позициях. В частности, для европейских языков обычно существуют следующие варианты:
набор кодов ISO 8859
кодовая страница Microsoft Windows, которая обычно берется из набора кодов 8859, но заменяет управляющие символы дополнительными графическими символами
кодовая страница IBM EBCDIC
кодовая страница IBM PC, совместимая с ASCII
Кодек |
Псевдонимы |
Языки |
---|---|---|
ascii |
646, us-ascii |
Английский язык |
большой5 |
big5-tw, csbig5 |
Традиционный китайский |
big5hkscs |
big5-hkscs, hkscs |
Традиционный китайский |
cp037 |
IBM037, IBM039 |
Английский язык |
cp273 |
273, IBM273, csIBM273 |
Немецкий Добавлено в версии 3.4. |
cp424 |
EBCDIC-CP-HE, IBM424 |
Иврит |
cp437 |
437, IBM437 |
Английский язык |
cp500 |
EBCDIC-CP-BE, EBCDIC-CP-CH, IBM500 |
Западная Европа |
cp720 |
Арабский язык |
|
cp737 |
Греция |
|
cp775 |
IBM775 |
Балтийские языки |
cp850 |
850, IBM850 |
Западная Европа |
cp852 |
852, IBM852 |
Центральная и Восточная Европа |
cp855 |
855, IBM855 |
Болгарский, белорусский, македонский, русский, сербский, русский язык |
cp856 |
Иврит |
|
cp857 |
857, IBM857 |
Турецкий |
cp858 |
858, IBM858 |
Западная Европа |
cp860 |
860, IBM860 |
Португальский язык |
cp861 |
861, CP-IS, IBM861 |
Исландия |
cp862 |
862, IBM862 |
Иврит |
cp863 |
863, IBM863 |
Канада |
cp864 |
IBM864 |
Арабский язык |
cp865 |
865, IBM865 |
датский, норвежский |
cp866 |
866, IBM866 |
Русский |
cp869 |
869, CP-GR, IBM869 |
Греция |
cp874 |
Тайский |
|
cp875 |
Греция |
|
cp932 |
932, ms932, mskanji, ms-kanji |
Японский |
cp949 |
949, ms949, uhc |
Корейский |
cp950 |
950, ms950 |
Традиционный китайский |
cp1006 |
Урду |
|
cp1026 |
ibm1026 |
Турецкий |
cp1125 |
1125, ibm1125, cp866u, ruscii |
Украинский Добавлено в версии 3.4. |
cp1140 |
ibm1140 |
Западная Европа |
cp1250 |
windows-1250 |
Центральная и Восточная Европа |
cp1251 |
windows-1251 |
Болгарский, белорусский, македонский, русский, сербский, русский язык |
cp1252 |
windows-1252 |
Западная Европа |
cp1253 |
windows-1253 |
Греция |
cp1254 |
windows-1254 |
Турецкий |
cp1255 |
windows-1255 |
Иврит |
cp1256 |
windows-1256 |
Арабский язык |
cp1257 |
windows-1257 |
Балтийские языки |
cp1258 |
windows-1258 |
Вьетнамцы |
euc_jp |
eucjp, ujis, u-jis |
Японский |
euc_jis_2004 |
jisx0213, eucjis2004 |
Японский |
euc_jisx0213 |
eucjisx0213 |
Японский |
euc_kr |
euckr, корейский, ksc5601, ks_c-5601, ks_c-5601-1987, ksx1001, ks_x-1001 |
Корейский |
gb2312 |
китай, csiso58gb231280, euc-cn, euccn, eucgb2312-cn, gb2312-1980, gb2312-80, iso-ir-58 |
Упрощенный китайский |
gbk |
936, cp936, ms936 |
Унифицированный китайский язык |
gb18030 |
gb18030-2000 |
Унифицированный китайский язык |
hz |
hzgb, hz-gb, hz-gb-2312 |
Упрощенный китайский |
iso2022_jp |
csiso2022jp, iso2022jp, iso-2022-jp |
Японский |
iso2022_jp_1 |
iso2022jp-1, iso-2022-jp-1 |
Японский |
iso2022_jp_2 |
iso2022jp-2, iso-2022-jp-2 |
Японский, Корейский, Упрощенный китайский, Западная Европа, Греческий |
iso2022_jp_2004 |
iso2022jp-2004, iso-2022-jp-2004 |
Японский |
iso2022_jp_3 |
iso2022jp-3, iso-2022-jp-3 |
Японский |
iso2022_jp_ext |
iso2022jp-ext, iso-2022-jp-ext |
Японский |
iso2022_kr |
csiso2022kr, iso2022kr, iso-2022-kr |
Корейский |
латынь_1 |
iso-8859-1, iso8859-1, 8859, cp819, latin, latin1, L1 |
Западная Европа |
iso8859_2 |
iso-8859-2, latin2, L2 |
Центральная и Восточная Европа |
iso8859_3 |
iso-8859-3, latin3, L3 |
Эсперанто, мальтийский |
iso8859_4 |
iso-8859-4, Latin4, L4 |
Балтийские языки |
iso8859_5 |
iso-8859-5, кириллица |
Болгарский, белорусский, македонский, русский, сербский, русский язык |
iso8859_6 |
изо-8859-6, арабик |
Арабский язык |
iso8859_7 |
iso-8859-7, greek, greek8 |
Греция |
iso8859_8 |
iso-8859-8, иврит |
Иврит |
iso8859_9 |
iso-8859-9, Latin5, L5 |
Турецкий |
iso8859_10 |
iso-8859-10, latin6, L6 |
Скандинавские языки |
iso8859_11 |
исо-8859-11, тайланд |
тайские языки |
iso8859_13 |
iso-8859-13, latin7, L7 |
Балтийские языки |
iso8859_14 |
iso-8859-14, latin8, L8 |
Кельтские языки |
iso8859_15 |
iso-8859-15, latin9, L9 |
Западная Европа |
iso8859_16 |
iso-8859-16, latin10, L10 |
Юго-Восточная Европа |
джохаб |
cp1361, ms1361 |
Корейский |
koi8_r |
Русский |
|
koi8_t |
Таджикистан Добавлено в версии 3.5. |
|
koi8_u |
Украинский |
|
kz1048 |
kz_1048, strk1048_2002, rk1048 |
Казахский Добавлено в версии 3.5. |
mac_cyrillic |
маккириллик |
Болгарский, белорусский, македонский, русский, сербский, русский язык |
mac_greek |
macgreek |
Греция |
mac_iceland |
maciceland |
Исландия |
mac_latin2 |
maclatin2, maccentraleurope, mac_centeuro |
Центральная и Восточная Европа |
mac_roman |
макроман, макинтош |
Западная Европа |
mac_turkish |
мактуркиш |
Турецкий |
ptcp154 |
csptcp154, pt154, cp154, cyrillic-asian |
Казахский |
shift_jis |
csshiftjis, shiftjis, sjis, s_jis |
Японский |
shift_jis_2004 |
shiftjis2004, sjis_2004, sjis2004 |
Японский |
shift_jisx0213 |
shiftjisx0213, sjisx0213, s_jisx0213 |
Японский |
utf_32 |
U32, utf32 |
все языки |
utf_32_be |
UTF-32BE |
все языки |
utf_32_le |
UTF-32LE |
все языки |
utf_16 |
U16, utf16 |
все языки |
utf_16_be |
UTF-16BE |
все языки |
utf_16_le |
UTF-16LE |
все языки |
utf_7 |
U7, unicode-1-1-utf-7 |
все языки |
utf_8 |
U8, UTF, utf8, cp65001 |
все языки |
utf_8_sig |
все языки |
Изменено в версии 3.4: Кодировщики utf-16* и utf-32* больше не позволяют кодировать суррогатные кодовые точки (U+D800
–U+DFFF
). Декодеры utf-32* больше не декодируют последовательности байтов, соответствующие суррогатным кодовым точкам.
Изменено в версии 3.8: cp65001
теперь является псевдонимом для utf_8
.
Специфические кодировки Python¶
Ряд предопределенных кодеков специфичен для Python, поэтому их названия не имеют смысла вне Python. Они перечислены в таблицах ниже на основе ожидаемых типов ввода и вывода (обратите внимание, что хотя текстовые кодировки являются наиболее распространенным случаем использования кодеков, базовая инфраструктура кодеков поддерживает произвольные преобразования данных, а не только текстовые кодировки). Для асимметричных кодеков указанное значение описывает направление кодирования.
Текстовые кодировки¶
Следующие кодеки обеспечивают кодирование str
в bytes
и декодирование bytes-like object в str
, аналогично кодировкам текста Unicode.
Кодек |
Псевдонимы |
Значение |
---|---|---|
Идна |
Реализуйте RFC 3490, см. также |
|
мбк |
ansi, dbcs |
Только для Windows: Кодируйте операнд в соответствии с кодовой страницей ANSI (CP_ACP). |
oem |
Только для Windows: Кодируйте операнд в соответствии с кодовой страницей OEM (CP_OEMCP). Добавлено в версии 3.6. |
|
palmos |
Кодирование PalmOS 3.5. |
|
punycode |
Реализуйте RFC 3492. Государственные кодеки не поддерживаются. |
|
raw_unicode_escape |
Кодировка Latin-1 с |
|
неопределенный |
Вызывает исключение для всех преобразований, даже для пустых строк. Обработчик ошибок игнорируется. |
|
уникод_эскейп |
Кодирование подходит как содержимое литерала Unicode в исходном коде Python в ASCII-кодировке, за исключением того, что кавычки не экранируются. Декодирование из исходного кода Latin-1. Следует помнить, что исходный код Python по умолчанию использует UTF-8. |
Изменено в версии 3.8: Кодек «unicode_internal» удален.
Двоичные преобразования¶
Следующие кодеки обеспечивают двоичные преобразования: преобразования bytes-like object в bytes
. Они не поддерживаются bytes.decode()
(который производит только вывод str
).
Кодек |
Псевдонимы |
Значение |
Кодер / декодер |
---|---|---|---|
base64_codec 1 |
base64, base_64 |
Преобразовать операнд в многострочный MIME base64 (результат всегда включает трейлинг Изменено в версии 3.4: принимает любые bytes-like object в качестве входных данных для кодирования и декодирования |
|
bz2_codec |
bz2 |
Сжать операнд с помощью bz2. |
|
hex_codec |
шестигранник |
Преобразование операнда в шестнадцатеричное представление, с двумя цифрами на байт. |
|
quopri_codec |
quopri, quotedprintable, quoted_printable |
Преобразование операнда в цитируемый печатный текст MIME. |
|
uu_codec |
uu |
Преобразование операнда с помощью uuencode. |
|
zlib_codec |
zip, zlib |
Сжать операнд с помощью gzip. |
- 1
В дополнение к bytes-like objects,
'base64_codec'
также принимает только ASCII экземплярыstr
для декодирования
Добавлено в версии 3.2: Восстановление бинарных преобразований.
Изменено в версии 3.4: Восстановление псевдонимов для бинарных преобразований.
Преобразования текста¶
Следующий кодек обеспечивает преобразование текста: преобразование str
в str
. Он не поддерживается str.encode()
(который производит только вывод bytes
).
Кодек |
Псевдонимы |
Значение |
---|---|---|
rot_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 в юникод. Более того, модуль socket
прозрачно преобразует имена хостов Unicode в ACE, так что приложениям не нужно заботиться о преобразовании имен хостов, когда они передают их модулю сокета. Кроме того, модули, имеющие имена хостов в качестве параметров функций, такие как http.client
и ftplib
, принимают имена хостов в Unicode (http.client
затем также прозрачно передает имя хоста IDNA в поле Host, если вообще передает это поле).
При получении имен хостов из сети (например, при обратном поиске имен) автоматическое преобразование в Юникод не выполняется: приложения, желающие представить такие имена хостов пользователю, должны декодировать их в Юникод.
Модуль encodings.idna
также реализует процедуру nameprep, которая выполняет определенную нормализацию имен хостов, чтобы добиться нечувствительности к регистру международных доменных имен и унифицировать похожие символы. При желании функции nameprep можно использовать напрямую.
-
encodings.idna.
nameprep
(label)¶ Возвращает версию label с расширенным именем. В настоящее время реализация предполагает строку запроса, поэтому
AllowUnassigned
будет истиной.
encodings.mbcs
— Кодовая страница Windows ANSI¶
Этот модуль реализует кодовую страницу ANSI (CP_ACP).
Availability: Только Windows.
Изменено в версии 3.3: Поддержка любого обработчика ошибок.
Изменено в версии 3.2: До версии 3.2 аргумент errors игнорировался; 'replace'
всегда использовался для кодирования, а 'ignore'
- для декодирования.
encodings.utf_8_sig
— Кодек UTF-8 с подписью BOM¶
Этот модуль реализует вариант кодека UTF-8. При кодировании к байтам, закодированным в UTF-8, будет добавляться BOM. Для кодера с состоянием это делается только один раз (при первой записи в поток байтов). При декодировании необязательный BOM в кодировке UTF-8 в начале данных будет пропущен.