codecs — Реестр кодировок и базовые классы
Исходный код: Lib/codecs.py
Этот модуль определяет базовые классы для стандартных кодировок Python (кодировщиков и декодировщиков) и предоставляет доступ к внутреннему регистру кодировок Python, который управляет процессом поиска кодировок и обработки ошибок. Большинство стандартных кодировок являются кодировками текста, которые кодируют текст в байты, но также существуют кодировки, которые кодируют текст в текст и байты в байты. Пользовательские кодировки могут кодировать и декодировать между произвольными типами, но некоторые функции модуля ограничены использованием именно с кодировками текста или с кодировками, которые кодируют в bytes.
Модуль определяет следующие функции для кодирования и декодирования с любой кодировкой:
-
codecs.encode(obj, encoding='utf-8', errors='strict') -
Кодирует obj с помощью кодировки, зарегистрированной для encoding.
Errors можно указать для настройки желаемой схемы обработки ошибок. По умолчанию используется обработчик ошибок
'strict', что означает, что ошибки кодирования вызываютValueError(или более специализированный подкласс кодировки, такой какUnicodeEncodeError). Дополнительную информацию об обработке ошибок кодировок см. в разделе Базовые классы кодировок.
-
codecs.decode(obj, encoding='utf-8', errors='strict') -
Декодирует obj с помощью кодировки, зарегистрированной для encoding.
Errors можно указать для настройки желаемой схемы обработки ошибок. По умолчанию используется обработчик ошибок
'strict', что означает, что ошибки декодирования вызываютValueError(или более специализированный подкласс кодировки, такой какUnicodeDecodeError). Дополнительную информацию об обработке ошибок кодировок см. в разделе Базовые классы кодировок.
Полные сведения о каждой кодировке также можно получить напрямую:
-
codecs.lookup(encoding) -
Ищет информацию о кодировке в регистре кодировок Python и возвращает объект
CodecInfo, как определено ниже.Кодировки сначала ищутся в кэше реестра. Если не найдено, сканируется список зарегистрированных функций поиска. Если объект
CodecInfoне найден, возникает ошибкаLookupError. В противном случае объектCodecInfoсохраняется в кэше и возвращается вызывающей стороне.
-
class codecs.CodecInfo(encode, decode, streamreader=None, streamwriter=None, incrementalencoder=None, incrementaldecoder=None, name=None) -
Детали кодировки при поиске в реестре кодировок. Аргументы конструктора хранятся в атрибутах с одинаковыми именами:
-
name -
Имя кодировки.
-
encode -
decode -
Функции статичного кодирования и декодирования. Они должны быть функциями или методами, которые имеют тот же интерфейс, что и методы
encode()иdecode()экземпляров Codec (см. Интерфейс кодировок). Ожидается, что функции или методы будут работать в бессостоятельном режиме.
-
incrementalencoder -
incrementaldecoder -
Классы или фабричные функции для инкрементального кодирования и декодирования. Они должны предоставить интерфейс, определенный базовыми классами
IncrementalEncoderиIncrementalDecoderсоответственно. Инкрементальные кодировки могут сохранять состояние.
-
streamwriter -
streamreader -
Классы или фабричные функции для работы с потоками записи и чтения. Они должны предоставить интерфейс, определенный базовыми классами
StreamWriterиStreamReaderсоответственно. Потоковые кодировки могут сохранять состояние.
-
Для упрощения доступа к различным компонентам кодировок модуль предоставляет дополнительные функции, использующие lookup() для поиска кодировки:
-
codecs.getencoder(encoding) -
Ищет кодировку для заданной кодировки и возвращает её функцию кодирования.
Возбуждает
LookupErrorв случае невозможности найти кодировку.
-
codecs.getdecoder(encoding) -
Ищет кодировку для заданной кодировки и возвращает её функцию декодирования.
Возбуждает
LookupErrorв случае невозможности найти кодировку.
-
codecs.getincrementalencoder(encoding) -
Ищет кодировку для заданной кодировки и возвращает её класс или фабричную функцию инкрементального кодирования.
Возбуждает
LookupErrorв случае невозможности найти кодировку или если кодировка не поддерживает инкрементальное кодирование.
-
codecs.getincrementaldecoder(encoding) -
Ищет кодировку для заданной кодировки и возвращает её класс или фабричную функцию инкрементального декодирования.
Возбуждает
LookupErrorв случае невозможности найти кодировку или если кодировка не поддерживает инкрементальное декодирование.
-
codecs.getreader(encoding) -
Ищет кодировку для заданной кодировки и возвращает её класс или фабричную функцию
StreamReader.Возбуждает
LookupErrorв случае невозможности найти кодировку.
-
codecs.getwriter(encoding) -
Ищет кодировку для заданной кодировки и возвращает её класс или фабричную функцию
StreamWriter.Возбуждает
LookupErrorв случае невозможности найти кодировку.
Пользовательские кодировки доступны путем регистрации подходящей функции поиска кодировок:
-
codecs.register(search_function) -
Регистрирует функцию поиска кодировки. Функции поиска принимают один аргумент — имя кодировки в нижнем регистре, и возвращают объект
CodecInfo. Если функция поиска не может найти заданную кодировку, она должна вернутьNone.Примечание
Регистрация функций поиска в настоящее время необратима, что может вызвать проблемы в некоторых случаях, таких как тестирование или перезагрузка модулей.
Хотя встроенные 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. Эта функция является генератором. Аргумент errors (а также любые другие ключевые аргументы) передается инкрементальному кодеру.
Эта функция требует, чтобы кодек принимал объекты типа
strдля кодирования. Поэтому она не поддерживает кодеры байты-в-байты, такие какbase64_codec.
-
codecs.iterdecode(iterator, encoding, errors='strict', **kwargs) -
Использует инкрементальный декодер для итеративного декодирования входных данных, предоставленных iterator. Эта функция является генератором. Аргумент 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: бессостояние кодировщик, бессостояние декодер, потоковый читатель и потоковый писатель. Потоковые читатели и писатели обычно повторно используют бессостояние кодировщик/декодер для реализации протоколов файлов. Авторы кодировщиков также должны определить, как кодировщик будет обрабатывать ошибки кодирования и декодирования.
Обработчики ошибок
Для упрощения и стандартизации обработки ошибок кодировщики могут реализовывать различные схемы обработки ошибок, принимая строковый аргумент errors. Все стандартные кодировщики Python определяют и реализуют следующие строковые значения:
Значение | Значение |
|---|---|
| Вызвать |
| Пропустить неверные данные и продолжить без дальнейших уведомлений. Реализовано в |
Следующие обработчики ошибок применимы только к кодировкам текста:
Значение | Значение |
|---|---|
| Заменить подходящим маркером; Python будет использовать официальный |
| Заменить соответствующей ссылкой на символ XML (только для кодирования). Реализовано в |
| Заменить последовательностями экранирования с обратной косой чертой. Реализовано в |
| Заменить последовательностями экранирования |
| При декодировании заменить байт отдельным кодом суррогата, изменяющимся от |
В дополнение к этому, следующий обработчик ошибок специфичен для данного кодировщика:
Значение | Кодировщики | Значение |
|---|---|---|
| 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 вызывается при кодировании и декодировании в случае ошибки, когда name задан как параметр errors.
При кодировании функция error_handler вызывается с экземпляром
UnicodeEncodeError, содержащим информацию о местоположении ошибки. Обработчик ошибок должен либо вызвать это, либо другое исключение, или вернуть кортеж с заменой для некодируемой части входных данных и позиции, где следует продолжить кодирование. Замена может быть либоstr, либоbytes. Если замена является байтами, кодировщик просто скопирует их в буфер вывода. Если замена является строкой, кодировщик закодирует замену. Кодирование продолжается на исходных входных данных в указанной позиции. Отрицательные значения позиции будут интерпретироваться как относительные к концу строки входных данных. Если полученная позиция выходит за пределы, будет выброшеноIndexError.Декодирование и перевод работают аналогично, за исключением того, что обработчику будет передан
UnicodeDecodeErrorилиUnicodeTranslateError, а замена из обработчика ошибок будет помещена непосредственно в вывод.
Ранее зарегистрированные обработчики ошибок (включая стандартные обработчики ошибок) могут быть найдены по имени:
-
codecs.lookup_error(name) -
Возвращает обработчик ошибок, зарегистрированный под именем name.
Вызывает
LookupErrorв случае, если обработчик не найден.
Следующие стандартные обработчики ошибок также доступны как функции уровня модуля:
-
codecs.strict_errors(exception) -
Реализует обработку ошибок
'strict': каждая ошибка кодирования или декодирования вызывает исключениеUnicodeError.
-
codecs.replace_errors(exception) -
Реализует обработку ошибок
'replace'(только для кодировок текста): заменяет'?'при ошибках кодирования (что будет закодировано кодировщиком) и'\ufffd'(замещающий символ Unicode) при ошибках декодирования.
-
codecs.ignore_errors(exception) -
Реализует обработку ошибок
'ignore': некорректные данные игнорируются, и кодирование или декодирование продолжаются без дальнейших уведомлений.
-
codecs.xmlcharrefreplace_errors(exception) -
Реализует обработку ошибок
'xmlcharrefreplace'(только для кодирования с кодировками текста): некодируемый символ заменяется соответствующей ссылкой на символ XML.
-
codecs.backslashreplace_errors(exception) -
Реализует обработку ошибок
'backslashreplace'(только для кодировок текста): некорректные данные заменяются последовательностью экранирования с обратной косой чертой.
-
codecs.namereplace_errors(exception) -
Реализует обработку ошибок
'namereplace'(только для кодирования с кодировками текста): некодируемый символ заменяется последовательностью экранирования\N{...}.Новое в версии 3.5.
Бессостоятельные кодирование и декодирование
Базовый Codec класс определяет эти методы, которые также определяют функциональные интерфейсы бессостоятельного кодера и декодера:
-
Codec.encode(input[, errors]) -
Кодирует объект input и возвращает кортеж (объект-выход, длина потреблённого). Например, кодирование текста преобразует строковый объект в байтовый объект, используя кодировку набора символов (например,
cp1252илиiso-8859-1).Аргумент errors определяет обработку ошибок. По умолчанию используется обработка
'strict'.Метод не должен хранить состояние в экземпляре
Codec. ИспользуйтеStreamWriterдля кодеров, которым необходимо хранить состояние для повышения эффективности кодирования.Кодер должен уметь обрабатывать вход нулевой длины и возвращать пустой объект типа объекта-выхода в этом случае.
-
Codec.decode(input[, errors]) -
Декодирует объект input и возвращает кортеж (объект-выход, длина потреблённого). Например, для кодирования текста декодирование преобразует байтовый объект, закодированный с помощью кодировки набора символов, в строковый объект.
Для кодировок текста и кодировок байты-в-байты, input должен быть байтовым объектом или объектом, предоставляющим интерфейс чтения только для буфера – например, объекты буфера и файлы с отображением памяти.
Аргумент errors определяет обработку ошибок. По умолчанию используется обработка
'strict'.Метод не должен хранить состояние в экземпляре
Codec. ИспользуйтеStreamReaderдля кодеров, которым необходимо хранить состояние для повышения эффективности декодирования.Декодер должен уметь обрабатывать вход нулевой длины и возвращать пустой объект типа объекта-выхода в этом случае.
Инкрементальное кодирование и декодирование
Классы IncrementalEncoder и IncrementalDecoder предоставляют базовый интерфейс для инкрементального кодирования и декодирования. Кодирование/декодирование входных данных выполняется не с помощью одного вызова бессостоятельного кодера/декодера, а с помощью нескольких вызовов метода encode()/decode() инкрементального кодера/декодера. Инкрементальный кодер/декодер отслеживает процесс кодирования/декодирования во время вызовов методов.
Объединённый результат вызовов метода encode()/decode() эквивалентен результату кодирования/декодирования всех отдельных входных данных, объединённых в один вход, бессостоятельным кодером/декодером.
Объекты IncrementalEncoder
Класс IncrementalEncoder используется для кодирования входных данных поэтапно. Он определяет следующие методы, которые должен определить каждый инкрементальный кодер для совместимости с реестром кодировок Python.
-
class codecs.IncrementalEncoder(errors='strict') -
Конструктор экземпляра
IncrementalEncoder.Все инкрементальные кодеры должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только определённые здесь используются реестром кодировок Python.
Класс
IncrementalEncoderможет реализовать различные схемы обработки ошибок, предоставив ключевой аргумент errors. См. Обработчики ошибок для возможных значений.Аргумент errors будет назначен атрибуту с тем же именем. Назначение этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок в течение жизненного цикла объекта
IncrementalEncoder.-
encode(object[, final]) -
Кодирует object (принимая во внимание текущее состояние кодера) и возвращает закодированный объект. Если это последний вызов
encode(), final должно быть true (по умолчанию false).
-
reset() -
Сброс кодера в начальное состояние. Выходные данные отбрасываются: вызовите
.encode(object, final=True), передав пустую строку байтов или текст, если необходимо, чтобы сбросить кодер и получить выходные данные.
-
getstate() -
Возвращает текущее состояние кодера, которое должно быть целым числом. Реализация должна гарантировать, что
0является наиболее распространённым состоянием. (Состояния, которые более сложные, чем целые числа, могут быть преобразованы в целые числа путём сериализации/пиклингования состояния и кодирования байтов полученной строки в целое число.)
-
setstate(state) -
Устанавливает состояние кодера в state. state должно быть состоянием кодера, возвращённым методом
getstate().
-
Объекты IncrementalDecoder
Класс IncrementalDecoder используется для декодирования входных данных поэтапно. Он определяет следующие методы, которые должен определить каждый инкрементальный декодер для совместимости с реестром кодировок Python.
-
class codecs.IncrementalDecoder(errors='strict') -
Конструктор экземпляра
IncrementalDecoder.Все инкрементальные декодеры должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только определённые здесь используются реестром кодировок Python.
Класс
IncrementalDecoderможет реализовать различные схемы обработки ошибок, предоставив ключевой аргумент errors. См. Обработчики ошибок для возможных значений.Аргумент errors будет назначен атрибуту с тем же именем. Назначение этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок в течение жизненного цикла объекта
IncrementalDecoder.-
decode(object[, final]) -
Декодирует object (принимая во внимание текущее состояние декодера) и возвращает декодированный объект. Если это последний вызов
decode(), final должно быть true (по умолчанию false). Если final true, декодер должен полностью декодировать вход и очистить все буферы. Если это невозможно (например, из-за неполных байтовых последовательностей в конце входных данных), он должен инициировать обработку ошибок так же, как и в бессостоятельном случае (что может вызвать исключение).
-
reset() -
Сброс декодера в начальное состояние.
-
getstate() -
Возвращает текущее состояние декодера. Это должен быть кортеж с двумя элементами: первый — буфер с ещё не декодированными входными данными, второй — целое число и дополнительная информация о состоянии. (Реализация должна гарантировать, что
0является наиболее распространённой дополнительной информацией о состоянии.) Если эта дополнительная информация о состоянии0должен быть возможным установить декодер в состояние, в котором нет буферизованных входных данных и0как дополнительная информация о состоянии, чтобы подача ранее буферизованных входных данных в декодер вернула его в предыдущее состояние без вывода каких-либо данных. (Дополнительная информация о состоянии, которая более сложная, чем целые числа, может быть преобразована в целое число путём сериализации/пиклингования информации и кодирования байтов полученной строки в целое число.)
-
setstate(state) -
Устанавливает состояние декодера в state. state должен быть состоянием декодера, возвращённым методом
getstate().
-
Кодирование и декодирование потоков
Классы StreamWriter и StreamReader предоставляют универсальные рабочие интерфейсы, которые можно легко использовать для реализации новых подмодулей кодирования. См. encodings.utf_8 для примера того, как это делается.
Объекты StreamWriter
Класс StreamWriter является подклассом Codec и определяет следующие методы, которые каждый объект записи потока должен определить для совместимости с реестром кодеков Python.
-
class codecs.StreamWriter(stream, errors='strict') -
Конструктор для экземпляра
StreamWriter.Все объекты записи потоков должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только те, которые определены здесь, используются реестром кодеков Python.
Аргумент stream должен быть объектом, похожим на файл, открытым для записи текстовых или двоичных данных, соответствующих конкретному кодеку.
Объект
StreamWriterможет реализовывать различные схемы обработки ошибок, предоставляя ключевой аргумент errors. См. Обработчики ошибок для стандартных обработчиков ошибок, которые может поддерживать кодек базового потока.Аргумент errors будет назначен атрибуту с тем же именем. Назначение этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок в течение срока службы объекта
StreamWriter.-
write(object) -
Записывает содержимое объекта, закодированное в поток.
-
writelines(list) -
Записывает конкатенированный список строк в поток (возможно, повторно используя метод
write()). Стандартные кодеки байты-в-байты не поддерживают этот метод.
-
reset() -
Очищает и сбрасывает буферы кодека, используемые для хранения состояния.
Вызов этого метода должен гарантировать, что данные на выходе находятся в чистом состоянии, которое позволяет добавлять новые свежие данные без необходимости повторного сканирования всего потока для восстановления состояния.
-
Помимо вышеперечисленных методов, StreamWriter также должен унаследовать все другие методы и атрибуты от базового потока.
Объекты StreamReader
Класс StreamReader является подклассом Codec и определяет следующие методы, которые каждый объект чтения потока должен определить для совместимости с реестром кодеков Python.
-
class codecs.StreamReader(stream, errors='strict') -
Конструктор для экземпляра
StreamReader.Все объекты чтения потоков должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только те, которые определены здесь, используются реестром кодеков Python.
Аргумент stream должен быть объектом, похожим на файл, открытым для чтения текстовых или двоичных данных, соответствующих конкретному кодеку.
Объект
StreamReaderможет реализовывать различные схемы обработки ошибок, предоставляя ключевой аргумент errors. См. Обработчики ошибок для стандартных обработчиков ошибок, которые может поддерживать кодек базового потока.Аргумент errors будет назначен атрибуту с тем же именем. Назначение этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок в течение срока службы объекта
StreamReaderобъекта.Множество разрешенных значений для аргумента errors можно расширить с помощью
register_error().-
read([size[, chars[, firstline]]]) -
Декодирует данные из потока и возвращает результат.
Аргумент chars указывает количество декодированных кодовых точек или байтов, которые нужно вернуть. Метод
read()никогда не вернет больше данных, чем запрошено, но может вернуть меньше, если доступно недостаточно данных.Аргумент size указывает приблизительное максимальное количество закодированных байтов или кодовых точек для чтения при декодировании. Декодер может изменять это значение по мере необходимости. Значение по умолчанию -1 указывает на чтение и декодирование как можно большего количества.
Флаг firstline указывает, что достаточно вернуть только первую строку, если на последующих строках есть ошибки декодирования.
Метод должен использовать стратегию жадного чтения, что означает, что он должен читать столько данных, сколько разрешено в соответствии с определением кодирования и заданным размером, например, если необязательные окончания кодирования или маркеры состояния доступны в потоке, они также должны быть прочитаны.
-
readline([size[, keepends]]) -
Считывает одну строку из входного потока и возвращает закодированные данные.
size, если задан, передается как аргумент size методу
read()потока.Если keepends ложно, окончания строк удаляются из возвращаемых строк.
-
readlines([sizehint[, keepends]]) -
Считывает все доступные строки из входного потока и возвращает их в виде списка строк.
Окончания строк реализуются с помощью метода кодека
decode()и включаются в записи списка, если keepends истинно.sizehint, если задан, передается как аргумент size методу
read()потока.
-
reset() -
Сбрасывает буферы кодека, используемые для хранения состояния.
Обратите внимание, что никакого перемещения потока не должно происходить. Этот метод предназначен в первую очередь для восстановления после ошибок декодирования.
-
Помимо вышеперечисленных методов, StreamReader также должен унаследовать все остальные методы и атрибуты от базового потока.
Объекты StreamReaderWriter
Класс StreamReaderWriter — это удобный класс, позволяющий оборачивать потоки, работающие в режимах чтения и записи.
Конструктор работает таким образом, что можно использовать функции-фабрики, возвращаемые функцией lookup(), для создания экземпляра.
-
class codecs.StreamReaderWriter(stream, Reader, Writer, errors='strict') -
Создает экземпляр
StreamReaderWriter. stream должен быть объектом, похожим на файл. Reader и Writer должны быть функциями-фабриками или классами, предоставляющими интерфейсStreamReaderиStreamWriterсоответственно. Обработка ошибок выполняется так же, как определено для объектов чтения и записи потоков.
Экземпляры StreamReaderWriter определяют объединенные интерфейсы классов StreamReader и StreamWriter. Они наследуют все другие методы и атрибуты от базового потока.
Объекты StreamRecoder
Класс StreamRecoder преобразует данные из одной кодировки в другую, что иногда полезно при работе с различными кодировками.
Для создания экземпляра можно использовать функции-фабрики, возвращаемые функцией lookup().
-
class codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors='strict') -
Создаёт экземпляр класса
StreamRecoder, реализующий двустороннее преобразование: методы encode и decode работают с передним интерфейсом — данными, видимыми кодом, вызывающимread()иwrite(), а Reader и Writer работают с задним интерфейсом — данными в потоке stream.Эти объекты можно использовать для прозрачного преобразования кодировок, например, из Latin-1 в UTF-8 и обратно.
Аргумент stream должен быть объектом, подобным файлу.
Аргументы encode и decode должны соответствовать интерфейсу
Codec. Reader и Writer должны быть функциями-фабриками или классами, предоставляющими объекты интерфейсаStreamReaderиStreamWriterсоответственно.Обработка ошибок выполняется так же, как определено для читателей и писателей потоков.
Экземпляры класса StreamRecoder определяют объединённый интерфейс классов StreamReader и StreamWriter. Они наследуют все другие методы и атрибуты от базового потока.
Обзор кодировок и Unicode
Строки хранятся внутри как последовательности кодовых точек в диапазоне 0x0–0x10FFFF. (См. PEP 393 для получения более подробной информации об реализации.) Как только строковый объект используется вне ЦП и памяти, возникает проблема с порядком байтов и способом хранения этих массивов в байтах. Как и в случае с другими кодеками, сериализация строки в последовательность байтов называется кодированием, а восстановление строки из последовательности байтов — декодированием. Существует множество различных кодировок текста, которые коллективно называются кодировками текста.
Самая простая кодировка текста (называемая 'latin-1' или 'iso-8859-1') сопоставляет кодовые точки 0–255 байтам 0x0–0xff, что означает, что строковый объект, содержащий кодовые точки выше U+00FF, не может быть закодирован этим кодеком. При попытке сделать это будет возбуждено исключение UnicodeEncodeError в виде (хотя детали сообщения об ошибке могут отличаться): UnicodeEncodeError: 'latin-1' codec can't encode character '\u1234' in
position 3: ordinal not in range(256).
Есть ещё одна группа кодировок (так называемые кодировки charmap), которые выбирают другое подмножество всех кодовых точек Unicode и способ отображения этих кодовых точек в байты 0x0–0xff. Чтобы увидеть, как это делается, просто откройте, например, encodings/cp1252.py (это кодировка, используемая в основном в Windows). Есть строковая константа с 256 символами, которая показывает, какой символ отображается в какой байт.
Все эти кодировки могут кодировать только 256 из 1114112 кодовых точек, определённых в Unicode. Простой и прямой способ хранения каждой кодовой точки Unicode — хранить каждую кодовую точку как четыре последовательных байта. Существуют две возможности: хранить байты в прямом или обратном порядке. Эти две кодировки называются UTF-32-BE и UTF-32-LE соответственно. Их недостаток заключается в том, что, например, если вы используете UTF-32-BE на машине с обратным порядком байтов, вам всегда нужно будет переставлять байты при кодировании и декодировании. UTF-32 решает эту проблему: байты всегда будут в естественном порядке байтов. Однако, если эти байты будут считаны ЦП с другим порядком байтов, байты необходимо будет переставить. Чтобы определить порядок байтов последовательности байтов UTF-16 или UTF-32, используется так называемый BOM («Byte Order Mark»). Это символ Unicode U+FEFF. Этот символ может быть добавлен в начало каждой последовательности байтов UTF-16 или UTF-32. Переставленная версия этого символа (0xFFFE) — недопустимый символ, который не может встречаться в тексте Unicode. Поэтому, если первый символ в последовательности байтов UTF-16 или UTF-32 оказывается символом U+FFFE, байты необходимо переставить при декодировании. К сожалению, символ U+FEFF имел второе назначение как ZERO WIDTH NO-BREAK SPACE: символ, у которого нет ширины и который не позволяет разбить слово. Его можно использовать, например, для указания алгоритму связывания (лигатур). В Unicode 4.0 использование U+FEFF в качестве ZERO WIDTH NO-BREAK SPACE устарело (и роль перешла к U+2060 (WORD JOINER)). Тем не менее, программное обеспечение Unicode по-прежнему должно уметь обрабатывать U+FEFF в обоих ролях: как BOM, это способ определения способа хранения закодированных байтов, и он исчезает после того, как последовательность байтов была декодирована в строку; как ZERO WIDTH
NO-BREAK SPACE, это обычный символ, который будет декодирован как любой другой.
Существует ещё одна кодировка, которая может кодировать весь диапазон символов Unicode: UTF-8. UTF-8 — это кодировка в 8 бит, что означает, что проблем с порядком байтов в UTF-8 нет. Каждый байт в последовательности байтов UTF-8 состоит из двух частей: биты маркера (самые старшие биты) и биты полезной нагрузки. Битами маркера являются последовательность от нуля до четырёх 1 битов, за которыми следует 0 бит. Символы Unicode кодируются следующим образом (x — биты полезной нагрузки, которые, будучи соединены вместе, дают символ Unicode):
Диапазон | Кодирование |
|---|---|
| 0xxxxxxx |
| 110xxxxx 10xxxxxx |
| 1110xxxx 10xxxxxx 10xxxxxx |
| 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
Самый младший бит символа Unicode — это самый правый бит x.
Так как UTF-8 — это кодировка в 8 бит, BOM не требуется, и любой символ U+FEFF в декодированной строке (даже если это первый символ) обрабатывается как ZERO
WIDTH NO-BREAK SPACE.
Без внешней информации невозможно надёжно определить, какая кодировка была использована для кодирования строки. Каждая кодировка charmap может декодировать любую произвольную последовательность байтов. Однако это невозможно с UTF-8, поскольку последовательности байтов UTF-8 имеют структуру, которая не допускает произвольных последовательностей байтов. Чтобы повысить надёжность определения кодировки UTF-8, Microsoft придумала вариант UTF-8 (который Python 2.5 называет "utf-8-sig") для своей программы Блокнот: перед записью любого из символов Unicode в файл записывается закодированный в UTF-8 BOM (который выглядит так в виде последовательности байтов: 0xef, 0xbb, 0xbf). Так как маловероятно, что любой файл, закодированный в charmap, начнётся с этих значений байтов (которые, например, в iso-8859-1 будут соответствовать
это увеличивает вероятность того, что кодировка utf-8-sig может быть правильно угадана по последовательности байтов. Таким образом, здесь BOM не используется для определения порядка байтов, используемого для генерации последовательности байтов, а как подпись, которая помогает угадать кодировку. При кодировании кодек utf-8-sig запишет 0xef, 0xbb, 0xbf как первые три байта в файл. При декодировании utf-8-sig пропустит эти три байта, если они встречаются как первые три байта в файле. В UTF-8 использование BOM не рекомендуется и его следует избегать.
Стандартные кодировки
Python предоставляет ряд встроенных кодеков, реализованных либо как функции C, либо с таблицами отображения в виде словарей. В следующей таблице перечислены кодеки по имени, вместе с несколькими общими псевдонимами и языками, для которых кодировка, вероятно, используется. Ни список псевдонимов, ни список языков не претендуют на полноту. Обратите внимание, что альтернативные варианты написания, которые отличаются только регистром или используют дефис вместо нижнего подчёркивания, также являются допустимыми псевдонимами; поэтому, например, 'utf-8' является допустимым псевдонимом для кодека 'utf_8'.
Деталь реализации CPython: Некоторые распространённые кодировки могут обойти механизм поиска кодеков для повышения производительности. Эти возможности оптимизации распознаются CPython только для ограниченного набора (регистронезависимых) псевдонимов: utf-8, utf8, latin-1, latin1, iso-8859-1, iso8859-1, mbcs (только Windows), ascii, us-ascii, utf-16, utf16, utf-32, utf32, и те же, используя нижние подчёркивания вместо дефисов. Использование альтернативных псевдонимов для этих кодировок может привести к замедлению выполнения.
Изменено в версии 3.6: Возможность оптимизации распознана для us-ascii.
Многие наборы символов поддерживают одни и те же языки. Они различаются отдельными символами (например, поддерживается ли символ EURO SIGN) и присвоением символов кодовым позициям. В частности, для европейских языков обычно существуют следующие варианты:
- набор символов ISO 8859
- страница кодов Microsoft Windows, обычно полученная из набора символов 8859, но заменяющая управляющие символы дополнительными графическими символами
- страница кодов IBM EBCDIC
- страница кодов IBM PC, совместимая с ASCII
Кодек | Псевдонимы | Языки |
|---|---|---|
ascii | 646, us-ascii | Английский |
big5 | big5-tw, csbig5 | Традиционный китайский |
big5hkscs | big5-hkscs, hkscs | Традиционный китайский |
cp037 | IBM037, IBM039 | Английский |
cp273 | 273, IBM273, csIBM273 |
Немецкий Новое в версии 3.4. |
cp424 | EBCDIC-CP-HE, IBM424 | Иврит |
cp437 | 437, IBM437 | Английский |
cp500 | EBCDIC-CP-BE, EBCDIC-CP-CH, IBM500 | Западная Европа |
cp720 | Арабский | |
cp737 | Греческий | |
cp775 | IBM775 | Балтийские языки |
cp850 | 850, IBM850 | Западная Европа |
cp852 | 852, IBM852 | Центральная и Восточная Европа |
cp855 | 855, IBM855 | Болгарский, Белорусский, Македонский, Русский, Сербский |
cp856 | Иврит | |
cp857 | 857, IBM857 | Турецкий |
cp858 | 858, IBM858 | Западная Европа |
cp860 | 860, IBM860 | Португальский |
cp861 | 861, CP-IS, IBM861 | Исландский |
cp862 | 862, IBM862 | Иврит |
cp863 | 863, IBM863 | Канадский |
cp864 | IBM864 | Арабский |
cp865 | 865, IBM865 | Датский, Норвежский |
cp866 | 866, IBM866 | Русский |
cp869 | 869, CP-GR, IBM869 | Греческий |
cp874 | Тайский | |
cp875 | Греческий | |
cp932 | 932, ms932, mskanji, ms-kanji | Японский |
cp949 | 949, ms949, uhc | Корейский |
cp950 | 950, ms950 | Традиционный китайский |
cp1006 | Урду | |
cp1026 | ibm1026 | Турецкий |
cp1125 | 1125, ibm1125, cp866u, ruscii |
Украинский Новое в версии 3.4. |
cp1140 | ibm1140 | Западная Европа |
cp1250 | windows-1250 | Центральная и Восточная Европа |
cp1251 | windows-1251 | Болгарский, Белорусский, Македонский, Русский, Сербский |
cp1252 | windows-1252 | Западная Европа |
cp1253 | windows-1253 | Греческий |
cp1254 | windows-1254 | Турецкий |
cp1255 | windows-1255 | Иврит |
cp1256 | windows-1256 | Арабский |
cp1257 | windows-1257 | Балтийские языки |
cp1258 | windows-1258 | Вьетнамский |
euc_jp | eucjp, ujis, u-jis | Японский |
euc_jis_2004 | jisx0213, eucjis2004 | Японский |
euc_jisx0213 | eucjisx0213 | Японский |
euc_kr | euckr, korean, ksc5601, ks_c-5601, ks_c-5601-1987, ksx1001, ks_x-1001 | Корейский |
gb2312 | chinese, csiso58gb231280, euc-cn, euccn, eucgb2312-cn, gb2312-1980, gb2312-80, iso-ir-58 | Упрощенный китайский |
gbk | 936, cp936, ms936 | Объединенный китайский |
gb18030 | gb18030-2000 | Объединенный китайский |
hz | hzgb, hz-gb, hz-gb-2312 | Упрощенный китайский |
iso2022_jp | csiso2022jp, iso2022jp, iso-2022-jp | Японский |
iso2022_jp_1 | iso2022jp-1, iso-2022-jp-1 | Японский |
iso2022_jp_2 | iso2022jp-2, iso-2022-jp-2 | Японский, Корейский, Упрощенный китайский, Западная Европа, Греческий |
iso2022_jp_2004 | iso2022jp-2004, iso-2022-jp-2004 | Японский |
iso2022_jp_3 | iso2022jp-3, iso-2022-jp-3 | Японский |
iso2022_jp_ext | iso2022jp-ext, iso-2022-jp-ext | Японский |
iso2022_kr | csiso2022kr, iso2022kr, iso-2022-kr | Корейский |
latin_1 | iso-8859-1, iso8859-1, 8859, cp819, latin, latin1, L1 | Западная Европа |
iso8859_2 | iso-8859-2, latin2, L2 | Центральная и Восточная Европа |
iso8859_3 | iso-8859-3, latin3, L3 | Эсперанто, Мальтийский |
iso8859_4 | iso-8859-4, latin4, L4 | Балтийские языки |
iso8859_5 | iso-8859-5, cyrillic | Болгарский, Белорусский, Македонский, Русский, Сербский |
iso8859_6 | iso-8859-6, arabic | Арабский |
iso8859_7 | iso-8859-7, greek, greek8 | Греческий |
iso8859_8 | iso-8859-8, hebrew | Иврит |
iso8859_9 | iso-8859-9, latin5, L5 | Турецкий |
iso8859_10 | iso-8859-10, latin6, L6 | Языки Северной Европы |
iso8859_11 | iso-8859-11, thai | Тайские языки |
iso8859_13 | iso-8859-13, latin7, L7 | Балтийские языки |
iso8859_14 | iso-8859-14, latin8, L8 | Келтские языки |
iso8859_15 | iso-8859-15, latin9, L9 | Западная Европа |
iso8859_16 | iso-8859-16, latin10, L10 | Юго-Восточная Европа |
johab | cp1361, ms1361 | Корейский |
koi8_r | Русский | |
koi8_t |
Таджикский Новое в версии 3.5. | |
koi8_u | Украинский | |
kz1048 | kz_1048, strk1048_2002, rk1048 |
Казахский Новое в версии 3.5. |
mac_cyrillic | maccyrillic | Болгарский, Белорусский, Македонский, Русский, Сербский |
mac_greek | macgreek | Греческий |
mac_iceland | maciceland | Исландский |
mac_latin2 | maclatin2, maccentraleurope | Центральная и Восточная Европа |
mac_roman | macroman, macintosh | Западная Европа |
mac_turkish | macturkish | Турецкий |
ptcp154 | csptcp154, pt154, cp154, cyrillic-asian | Казахский |
shift_jis | csshiftjis, shiftjis, sjis, s_jis | Японский |
shift_jis_2004 | shiftjis2004, sjis_2004, sjis2004 | Японский |
shift_jisx0213 | shiftjisx0213, sjisx0213, s_jisx0213 | Японский |
utf_32 | U32, utf32 | все языки |
utf_32_be | UTF-32BE | все языки |
utf_32_le | UTF-32LE | все языки |
utf_16 | U16, utf16 | все языки |
utf_16_be | UTF-16BE | все языки |
utf_16_le | UTF-16LE | все языки |
utf_7 | U7, unicode-1-1-utf-7 | все языки |
utf_8 | U8, UTF, utf8, cp65001 | все языки |
utf_8_sig | все языки |
Изменено в версии 3.4: Кодировщики utf-16* и utf-32* больше не допускают кодирования кодовых точек суррогатных символов (U+D800–U+DFFF). Декодеры utf-32* больше не декодируют последовательности байтов, соответствующие кодовым точкам суррогатных символов.
Изменено в версии 3.8: cp65001 теперь является псевдонимом для utf_8.
Утилиты кодирования, специфичные для Python
Несколько предопределённых кодеков специфичны для Python, поэтому их имена кодеков не имеют смысла вне Python. Эти кодеки перечислены в таблицах ниже в зависимости от ожидаемых типов входных и выходных данных (обратите внимание, что, хотя текстовые кодировки являются наиболее распространённым случаем использования кодеков, основная инфраструктура кодеков поддерживает произвольные преобразования данных, а не только текстовые кодировки). Для асимметричных кодеков указанное значение описывает направление кодирования.
Текстовые кодировки
Следующие кодеки обеспечивают кодирование str в bytes и декодирование байтоподобных объектов в str, аналогично кодировкам Unicode.
Кодек | Псевдонимы | Значение |
|---|---|---|
idna | Реализует RFC 3490, также см. | |
mbcs | ansi, dbcs | Только Windows: закодировать операнд в соответствии со страницей кодов ANSI (CP_ACP). |
oem | Только Windows: закодировать операнд в соответствии со страницей кодов OEM (CP_OEMCP). Новое в версии 3.6. | |
palmos | Кодировка PalmOS 3.5. | |
punycode | Реализует RFC 3492. Состоятельные кодеки не поддерживаются. | |
raw_unicode_escape | Latin-1 кодировка с | |
undefined | Вызвать исключение для всех преобразований, даже для пустых строк. Обработчик ошибок игнорируется. | |
unicode_escape | Кодирование, подходящее для содержимого литерала Unicode в коде Python, закодированном в ASCII, за исключением того, что кавычки не экранируются. Декодировать из исходного кода Latin-1. Имейте в виду, что исходный код Python по умолчанию использует UTF-8. |
Изменено в версии 3.8: Кодек «unicode_internal» удалён.
Бинарные преобразования
Следующие кодеки обеспечивают бинарные преобразования: отображение байтоподобных объектов в bytes. Они не поддерживаются bytes.decode() (который производит только выходной str).
Кодек | Псевдонимы | Значение | Кодер / декодер |
|---|---|---|---|
base64_codec 1 | base64, base_64 | Преобразовать операнд в многострочный MIME base64 (результат всегда включает в себя конечный Изменено в версии 3.4: принимает любой байтоподобный объект в качестве входных данных для кодирования и декодирования | |
bz2_codec | bz2 | Сжать операнд с помощью bz2. | |
hex_codec | hex | Преобразовать операнд в шестнадцатеричное представление с двумя цифрами на байт. | |
quopri_codec | quopri, quotedprintable, quoted_printable | Преобразовать операнд в MIME quoted printable. |
|
uu_codec | uu | Преобразовать операнд с помощью uuencode. | |
zlib_codec | zip, zlib | Сжать операнд с помощью gzip. |
-
1 -
В дополнение к байтоподобным объектам,
'base64_codec'также принимает ASCII-только экземплярыstrдля декодирования
Новое в версии 3.2: Восстановление бинарных преобразований.
Изменено в версии 3.4: Восстановление псевдонимов для бинарных преобразований.
Текстовые преобразования
Следующий кодек предоставляет текстовое преобразование: отображение str в str. Он не поддерживается str.encode() (который производит только выходные bytes).
Кодек | Псевдонимы | Значение |
|---|---|---|
rot_13 | rot13 | Возвращает шифрование Цезаря операнда. |
Новое в версии 3.2: Восстановление текстового преобразования rot_13.
Изменено в версии 3.4: Восстановление псевдонима rot13.
encodings.idna — Международные доменные имена в приложениях
Этот модуль реализует RFC 3490 (Международные доменные имена в приложениях) и RFC 3492 (Nameprep: Профиль Stringprep для международных доменных имён (IDN)). Он построен на основе кодировки punycode и stringprep.
Если вам нужен стандарт IDNA 2008 из RFC 5891 и RFC 5895, используйте стороннюю idna module <https://pypi.org/project/idna/>_.
Эти RFC вместе определяют протокол для поддержки символов, отличных от ASCII, в доменных именах. Доменное имя, содержащее символы, отличные от ASCII (например, www.Alliancefrançaise.nu), преобразуется в совместимую с ASCII кодировку (ACE, например, www.xn--alliancefranaise-npb.nu). Форма ACE доменного имени затем используется во всех местах, где произвольные символы не допускаются протоколом, таких как запросы DNS, поля HTTP Host и так далее. Это преобразование выполняется в приложении; если возможно, незаметно для пользователя: приложение должно прозрачно преобразовывать метки доменных имён Unicode в IDNA в сети и преобразовывать метки ACE обратно в Unicode перед представлением их пользователю.
Python поддерживает это преобразование несколькими способами: кодек idna выполняет преобразование между Unicode и ACE, разделяя входную строку на метки на основе символов-разделителей, определённых в разделе 3.1 RFC 3490, и преобразует каждую метку в ACE по мере необходимости, и наоборот, разделяя входную строку байтов на метки на основе разделителя . и преобразуя любые обнаруженные метки ACE в Unicode. Кроме того, модуль socket прозрачно преобразует имена хостов Unicode в ACE, так что приложениям не нужно беспокоиться о преобразовании имён хостов самим, когда они передают их модулю сокетов. Кроме того, модули, у которых имена хостов являются параметрами функций, такие как http.client и ftplib, принимают имена хостов Unicode (http.client затем также прозрачно отправляет имя хоста IDNA в поле Host, если отправляет это поле вообще).
При получении имён хостов из сети (например, при обратном поиске имён) автоматическое преобразование в Unicode не выполняется: приложения, желающие представить такие имена хостов пользователю, должны декодировать их в Unicode.
Модуль encodings.idna также реализует процедуру nameprep, которая выполняет определённые нормализации имён хостов для достижения регистронезависимости международных доменных имён и унификации похожих символов. Функции nameprep можно использовать напрямую, если необходимо.
-
encodings.idna.nameprep(label) -
Возвращает преобразованную версию label. Реализация в настоящее время предполагает запросы, поэтому
AllowUnassignedравно true.
-
encodings.idna.ToASCII(label) -
Преобразует метку в ASCII, как указано в RFC 3490.
UseSTD3ASCIIRulesпредполагается как false.
-
encodings.idna.ToUnicode(label) -
Преобразует метку в Unicode, как указано в RFC 3490.
encodings.mbcs — Кодовая страница Windows ANSI
Этот модуль реализует кодовую страницу ANSI (CP_ACP).
Доступность: Только Windows.
Изменено в версии 3.3: Поддержка любого обработчика ошибок.
Изменено в версии 3.2: До версии 3.2 аргумент errors игнорировался; 'replace' всегда использовался для кодирования, а 'ignore' для декодирования.
encodings.utf_8_sig — Кодек UTF-8 с сигнатурой BOM
Этот модуль реализует вариант кодека UTF-8. При кодировании к закодированным в UTF-8 байтам будет добавлен BOM, закодированный в UTF-8. Для состоятельного кодера это делается только один раз (при первом записи в поток байтов). При декодировании необязательный BOM, закодированный в UTF-8, в начале данных будет пропущен.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/codecs.html