codecs — Реестр кодеков и базовые классы
Исходный код: Lib/codecs.py
Этот модуль определяет базовые классы для стандартных кодеков Python (кодировщиков и декодировщиков) и предоставляет доступ к внутреннему реестру кодеков Python, который управляет поиском кодеков и обработчиков ошибок. Большинство стандартных кодеков — это кодировки текста, преобразующие текст в байты (и байты в текст), но также существуют кодеки, преобразующие текст в текст и байты в байты. Пользовательские кодеки могут выполнять кодирование и декодирование между произвольными типами, однако некоторые возможности модуля предназначены только для использования с кодировками текста или кодеками, выполняющими кодирование в bytes.
Модуль определяет следующие функции для кодирования и декодирования с помощью любого кодека:
-
codecs.encode(obj, encoding='utf-8', errors='strict') -
Кодирует obj с помощью кодека, зарегистрированного для encoding.
Аргумент errors можно указать, чтобы задать требуемую схему обработки ошибок. Обработчик ошибок по умолчанию —
'strict', то есть ошибки кодирования вызывают исключениеValueError(или более специализированный подкласс для конкретного кодека, напримерUnicodeEncodeError). Дополнительные сведения об обработке ошибок кодека см. в разделе Базовые классы кодеков.
-
codecs.decode(obj, encoding='utf-8', errors='strict') -
Декодирует obj с помощью кодека, зарегистрированного для encoding.
Аргумент errors можно указать, чтобы задать требуемую схему обработки ошибок. Обработчик ошибок по умолчанию —
'strict', то есть ошибки декодирования вызывают исключениеValueError(или более специализированный подкласс для конкретного кодека, напримерUnicodeDecodeError). Дополнительные сведения об обработке ошибок кодека см. в разделе Базовые классы кодеков.
-
codecs.charmap_build(string) -
Возвращает таблицу соответствия, подходящую для кодирования с помощью пользовательской однобайтовой кодировки. Принимает
strstring длиной не более 256 символов, представляющую таблицу декодирования, и возвращает либо компактный внутренний объект таблицы соответствияEncodingMap, либо таблицуdictionary, сопоставляющую порядковые номера символов значениям байтов. При недопустимом вводе вызывает исключениеTypeError.
Полные сведения о каждом кодеке можно также получить непосредственно:
-
codecs.lookup(encoding, /) -
Ищет сведения о кодеке в реестре кодеков Python и возвращает объект
CodecInfo, определённый ниже.Сначала кодировки ищутся в кэше реестра. Если кодировка не найдена, выполняется перебор списка зарегистрированных функций поиска. Если объект
CodecInfoне найден, вызывается исключениеLookupError. В противном случае объектCodecInfoсохраняется в кэше и возвращается вызывающему коду.
-
class codecs.CodecInfo(encode, decode, streamreader=None, streamwriter=None, incrementalencoder=None, incrementaldecoder=None, name=None) -
Сведения о кодеке, полученные при поиске в реестре кодеков. Аргументы конструктора сохраняются в атрибутах с такими же именами:
-
name -
Название кодировки.
-
encode -
decode -
Функции кодирования и декодирования без сохранения состояния. Это должны быть функции или методы с тем же интерфейсом, что и у методов
encode()иdecode()экземпляров Codec (см. раздел Интерфейс кодека). Предполагается, что функции или методы работают без сохранения состояния.
-
incrementalencoder -
incrementaldecoder -
Классы или фабричные функции инкрементального кодировщика и декодировщика. Они должны предоставлять интерфейс, определённый базовыми классами
IncrementalEncoderиIncrementalDecoderсоответственно. Инкрементальные кодеки могут сохранять состояние.
-
streamwriter -
streamreader -
Классы или фабричные функции для записи и чтения потоков. Они должны предоставлять интерфейс, определённый базовыми классами
StreamWriterиStreamReaderсоответственно. Потоковые кодеки могут сохранять состояние.
-
Чтобы упростить доступ к различным компонентам кодека, модуль предоставляет следующие дополнительные функции, использующие lookup() для поиска кодека:
-
codecs.getencoder(encoding) -
Ищет кодек для указанной кодировки и возвращает его функцию кодирования.
Если кодировка не найдена, вызывает исключение
LookupError.
-
codecs.getdecoder(encoding) -
Ищет кодек для указанной кодировки и возвращает его функцию декодирования.
Если кодировка не найдена, вызывает исключение
LookupError.
-
codecs.getincrementalencoder(encoding) -
Ищет кодек для указанной кодировки и возвращает его класс инкрементального кодировщика или фабричную функцию.
Если кодировка не найдена или кодек не поддерживает инкрементальное кодирование, вызывает исключение
LookupError.
-
codecs.getincrementaldecoder(encoding) -
Ищет кодек для указанной кодировки и возвращает его класс инкрементального декодировщика или фабричную функцию.
Если кодировка не найдена или кодек не поддерживает инкрементальное декодирование, вызывает исключение
LookupError.
-
codecs.getreader(encoding) -
Ищет кодек для указанной кодировки и возвращает его класс
StreamReaderили фабричную функцию.Если кодировка не найдена, вызывает исключение
LookupError.
-
codecs.getwriter(encoding) -
Ищет кодек для указанной кодировки и возвращает его класс
StreamWriterили фабричную функцию.Если кодировка не найдена, вызывает исключение
LookupError.
Пользовательские кодеки становятся доступными после регистрации подходящей функции поиска кодеков:
-
codecs.register(search_function, /) -
Регистрирует функцию поиска кодеков. Функции поиска должны принимать один аргумент — название кодировки, записанное строчными буквами, в котором дефисы и пробелы заменены символами подчёркивания, — и возвращать объект
CodecInfo. Если функция поиска не может найти указанную кодировку, она должна возвращатьNone.Изменено в версии 3.9: Дефисы и пробелы заменяются символами подчёркивания.
-
codecs.unregister(search_function, /) -
Отменяет регистрацию функции поиска кодеков и очищает кэш реестра. Если функция поиска не зарегистрирована, ничего не происходит.
Добавлено в версии 3.10.
Хотя встроенная функция open() и связанный с ней модуль io рекомендуются для работы с текстовыми файлами в кодировке, этот модуль предоставляет дополнительные вспомогательные функции и классы, позволяющие использовать более широкий диапазон кодеков при работе с двоичными файлами:
-
codecs.open(filename, mode='r', encoding=None, errors='strict', buffering=-1) -
Открывает файл в кодировке с указанным mode и возвращает экземпляр
StreamReaderWriter, обеспечивающий прозрачное кодирование и декодирование. Режим файла по умолчанию —'r', то есть файл открывается для чтения.Примечание
Если encoding не равен
None, базовые файлы в кодировке всегда открываются в двоичном режиме. При чтении и записи автоматическое преобразование'\n'не выполняется. Аргумент mode может иметь любое значение двоичного режима, допустимое для встроенной функцииopen(); значение'b'добавляется автоматически.encoding задаёт кодировку, которую следует использовать для файла. Допускается любая кодировка, преобразующая данные в байты и из байтов; поддерживаемые файловыми методами типы данных зависят от используемого кодека.
Аргумент errors можно указать для определения обработки ошибок. По умолчанию используется
'strict', при котором в случае ошибки кодирования вызывается исключениеValueError.Аргумент buffering имеет то же значение, что и для встроенной функции
open(). По умолчанию он равен -1, что означает использование размера буфера по умолчанию.Изменено в версии 3.11: Режим
'U'удалён.Устарело с версии 3.14:
codecs.open()заменён наopen().
-
codecs.EncodedFile(file, data_encoding, file_encoding=None, errors='strict') -
Возвращает экземпляр
StreamRecoder— обёрнутую версию file, обеспечивающую прозрачное перекодирование. Исходный файл закрывается при закрытии обёрнутой версии.Данные, записываемые в обёрнутый файл, декодируются в соответствии с указанной data_encoding, а затем записываются в исходный файл в виде байтов с использованием file_encoding. Байты, считываемые из исходного файла, декодируются в соответствии с file_encoding, а полученный результат кодируется с помощью data_encoding.
Если file_encoding не задана, по умолчанию используется data_encoding.
Аргумент errors можно указать для определения обработки ошибок. По умолчанию используется
'strict', при котором в случае ошибки кодирования вызывается исключениеValueError.
-
codecs.iterencode(iterator, encoding, errors='strict', **kwargs) -
Использует инкрементальный кодировщик для последовательного кодирования входных данных, предоставляемых iterator. iterator должен выдавать объекты
str. Эта функция является генератором. Аргумент errors (как и любой другой именованный аргумент) передаётся инкрементальному кодировщику.Для этой функции требуется, чтобы кодек принимал для кодирования текстовые объекты
str. Поэтому она не поддерживает кодировщики, преобразующие байты в байты, напримерbase64_codec.
-
codecs.iterdecode(iterator, encoding, errors='strict', **kwargs) -
Использует инкрементальный декодировщик для последовательного декодирования входных данных, предоставляемых iterator. iterator должен выдавать объекты
bytes. Эта функция является генератором. Аргумент errors (как и любой другой именованный аргумент) передаётся инкрементальному декодировщику.Для этой функции требуется, чтобы кодек принимал для декодирования объекты
bytes. Поэтому она не поддерживает кодировщики, преобразующие текст в текст, напримерrot_13, хотяrot_13можно равнозначно использовать сiterencode().
-
codecs.readbuffer_encode(buffer, errors=None, /) -
Возвращает
tuple, содержащий необработанные байты объекта buffer — объекта, совместимого с буфером, илиstr(перед обработкой преобразуется в UTF-8), — а также их длину в байтах.Аргумент errors игнорируется.
>>> codecs.readbuffer_encode(b"Zito") (b'Zito', 4)
Модуль также предоставляет следующие константы, полезные для чтения и записи файлов, зависящих от платформы:
-
codecs.BOM -
codecs.BOM_BE -
codecs.BOM_LE -
codecs.BOM_UTF8 -
codecs.BOM_UTF16 -
codecs.BOM_UTF16_BE -
codecs.BOM_UTF16_LE -
codecs.BOM_UTF32 -
codecs.BOM_UTF32_BE -
codecs.BOM_UTF32_LE -
Эти константы определяют различные последовательности байтов — маркеры порядка байтов Unicode (BOM) для нескольких кодировок. Они используются в потоках данных UTF-16 и UTF-32 для указания порядка байтов, а в UTF-8 — в качестве сигнатуры Unicode. Значение
BOM_UTF16равно либоBOM_UTF16_BE, либоBOM_UTF16_LEв зависимости от собственного порядка байтов платформы;BOMявляется псевдонимом дляBOM_UTF16,BOM_LE— дляBOM_UTF16_LE, аBOM_BE— дляBOM_UTF16_BE. Остальные представляют BOM в кодировках UTF-8 и UTF-32.
Базовые классы кодеков
Модуль codecs определяет набор базовых классов, задающих интерфейсы для работы с объектами кодеков. Эти классы также можно использовать как основу для пользовательских реализаций кодеков.
Чтобы кодек можно было использовать в Python, он должен определять четыре интерфейса: кодировщик без сохранения состояния, декодировщик без сохранения состояния, устройство чтения потока и устройство записи потока. Устройства чтения и записи потока обычно используют кодировщик и декодировщик без сохранения состояния для реализации файловых протоколов. Авторы кодеков также должны определить, как кодек будет обрабатывать ошибки кодирования и декодирования.
Обработчики ошибок
Для упрощения и стандартизации обработки ошибок кодеки могут реализовывать различные схемы обработки ошибок, принимая строковый аргумент errors:
>>> 'German ß, ♬'.encode(encoding='ascii', errors='backslashreplace') b'German \\xdf, \\u266c' >>> 'German ß, ♬'.encode(encoding='ascii', errors='xmlcharrefreplace') b'German ß, ♬'
Со всеми кодеками Python из раздела Стандартные кодировки можно использовать следующие обработчики ошибок:
Значение | Описание |
|---|---|
| Вызывает |
| Игнорирует некорректные данные и продолжает работу без дополнительных уведомлений. Реализован в |
| Заменяет ошибочные данные маркером замены. При кодировании используется |
| Заменяет ошибочные данные escape-последовательностями с обратной косой чертой. При кодировании используется шестнадцатеричная форма кодовой точки Unicode в форматах |
| При декодировании заменяет байт отдельным суррогатным кодом из диапазона от |
Следующие обработчики ошибок применимы только при кодировании (в рамках текстовых кодировок):
Значение | Описание |
|---|---|
| Заменяет символ его числовой ссылкой 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, официальный СИМВОЛ ЗАМЕНЫ).
-
codecs.backslashreplace_errors(exception) -
Реализует обработку ошибок
'backslashreplace'.Некорректные данные заменяются escape-последовательностью с обратной косой чертой. При кодировании используется шестнадцатеричная форма кодовой точки Unicode в форматах
\xhh\uxxxx\Uxxxxxxxx. При декодировании используется шестнадцатеричная форма значения байта в формате\xhh.Изменено в версии 3.5: Работает при декодировании и преобразовании.
-
codecs.xmlcharrefreplace_errors(exception) -
Реализует обработку ошибок
'xmlcharrefreplace'(только при кодировании в рамках текстовой кодировки).Некодируемый символ заменяется соответствующей числовой ссылкой XML/HTML, представляющей собой десятичную форму кодовой точки Unicode в формате
&#num;.
-
codecs.namereplace_errors(exception) -
Реализует обработку ошибок
'namereplace'(только при кодировании в рамках текстовой кодировки).Некодируемый символ заменяется escape-последовательностью
\N{...}. Набор символов в фигурных скобках — это свойство Name из базы данных символов Unicode. Например, немецкая строчная буква'ß'будет преобразована в последовательность байтов\N{LATIN SMALL LETTER SHARP S}.Добавлено в версии 3.5.
Кодирование и декодирование без сохранения состояния
Базовый класс Codec определяет следующие методы, которые также задают интерфейсы функций кодировщика и декодировщика без сохранения состояния:
-
class codecs.Codec -
-
encode(input, errors='strict') -
Кодирует объект input и возвращает кортеж (выходной объект, количество обработанных элементов). Например, текстовое кодирование преобразует строковый объект в байтовый объект, используя кодировку определенного набора символов (например,
cp1252илиiso-8859-1).Аргумент errors задает способ обработки ошибок. По умолчанию используется обработка
'strict'.Метод не должен сохранять состояние в экземпляре
Codec. Для кодеков, которым необходимо сохранять состояние для повышения эффективности кодирования, используйтеStreamWriter.Кодировщик должен поддерживать пустые входные данные и в этом случае возвращать пустой объект выходного типа.
-
decode(input, errors='strict') -
Декодирует объект input и возвращает кортеж (выходной объект, количество обработанных элементов). Например, для текстовой кодировки декодирование преобразует байтовый объект, закодированный с помощью кодировки определенного набора символов, в строковый объект.
Для текстовых кодировок и кодеков преобразования байтов в байты объект input должен быть байтовым объектом или объектом, предоставляющим интерфейс буфера только для чтения, например объектом буфера или файлом, отображенным в память.
Аргумент errors задает способ обработки ошибок. По умолчанию используется обработка
'strict'.Метод не должен сохранять состояние в экземпляре
Codec. Для кодеков, которым необходимо сохранять состояние для повышения эффективности декодирования, используйтеStreamReader.Декодировщик должен поддерживать пустые входные данные и в этом случае возвращать пустой объект выходного типа.
-
Инкрементное кодирование и декодирование
Классы IncrementalEncoder и IncrementalDecoder предоставляют базовый интерфейс для инкрементного кодирования и декодирования. Кодирование или декодирование входных данных выполняется не одним вызовом функции кодировщика или декодировщика без сохранения состояния, а несколькими вызовами метода encode() или decode() инкрементного кодировщика или декодировщика. Инкрементный кодировщик или декодировщик отслеживает ход кодирования или декодирования между вызовами методов.
Результат объединения выходных данных вызовов метода encode() или decode() совпадает с результатом кодирования или декодирования всех объединенных входных данных с помощью кодировщика или декодировщика без сохранения состояния.
Объекты IncrementalEncoder
Класс IncrementalEncoder используется для кодирования входных данных в несколько этапов. Он определяет следующие методы, которые должен реализовать каждый инкрементный кодировщик для совместимости с реестром кодеков Python.
-
class codecs.IncrementalEncoder(errors='strict') -
Конструктор экземпляра
IncrementalEncoder.Все инкрементные кодировщики должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные именованные аргументы, но реестр кодеков Python использует только аргументы, определенные здесь.
Класс
IncrementalEncoderможет реализовывать различные схемы обработки ошибок, принимая именованный аргумент errors. Возможные значения см. в разделе Обработчики ошибок.Аргумент errors будет присвоен атрибуту с тем же именем. Присваивание этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок в течение срока жизни объекта
IncrementalEncoder.-
encode(object, final=False) -
Кодирует object (с учетом текущего состояния кодировщика) и возвращает полученный закодированный объект. Если это последний вызов
encode(), параметр final должен иметь значение true (по умолчанию он равен false).
-
reset() -
Сбрасывает кодировщик в исходное состояние. Выходные данные отбрасываются: при необходимости вызовите
.encode(object, final=True), передав пустую байтовую или текстовую строку, чтобы сбросить кодировщик и получить выходные данные.
-
getstate() -
Возвращает текущее состояние кодировщика, которое должно быть целым числом. Реализация должна гарантировать, что
0— наиболее распространенное состояние. (Состояния, более сложные, чем целые числа, можно преобразовать в целое число, сериализовав состояние и закодировав байты полученной строки в целое число.)
-
setstate(state) -
Устанавливает состояние кодировщика равным state. Значение state должно быть состоянием кодировщика, возвращенным методом
getstate().
-
Объекты IncrementalDecoder
Класс IncrementalDecoder используется для декодирования входных данных в несколько этапов. Он определяет следующие методы, которые должен реализовать каждый инкрементный декодировщик для совместимости с реестром кодеков Python.
-
class codecs.IncrementalDecoder(errors='strict') -
Конструктор экземпляра
IncrementalDecoder.Все инкрементные декодировщики должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные именованные аргументы, но реестр кодеков Python использует только аргументы, определенные здесь.
Класс
IncrementalDecoderможет реализовывать различные схемы обработки ошибок, принимая именованный аргумент errors. Возможные значения см. в разделе Обработчики ошибок.Аргумент errors будет присвоен атрибуту с тем же именем. Присваивание этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок в течение срока жизни объекта
IncrementalDecoder.-
decode(object, final=False) -
Декодирует object (с учетом текущего состояния декодировщика) и возвращает полученный декодированный объект. Если это последний вызов
decode(), параметр final должен иметь значение true (по умолчанию он равен false). Если final имеет значение true, декодировщик должен полностью декодировать входные данные и очистить все буферы. Если это невозможно (например, из-за неполных байтовых последовательностей в конце входных данных), он должен запустить обработку ошибок, как и в случае декодирования без сохранения состояния (что может привести к возникновению исключения).
-
reset() -
Сбрасывает декодировщик в исходное состояние.
-
getstate() -
Возвращает текущее состояние декодировщика. Это должен быть кортеж из двух элементов: первый должен быть буфером, содержащим еще не декодированные входные данные. Второй должен быть целым числом и может содержать дополнительные сведения о состоянии. (Реализация должна гарантировать, что
0— наиболее распространенное значение дополнительных сведений о состоянии.) Если эти дополнительные сведения о состоянии равны0, должна быть возможность установить декодировщик в состояние без буферизованных входных данных и со значением0в качестве дополнительных сведений о состоянии, чтобы передача ранее буферизованных входных данных декодировщику возвращала его в предыдущее состояние без создания выходных данных. (Дополнительные сведения о состоянии, более сложные, чем целые числа, можно преобразовать в целое число, сериализовав их и закодировав байты полученной строки в целое число.)
-
setstate(state) -
Устанавливает состояние декодировщика равным state. Значение state должно быть состоянием декодировщика, возвращенным методом
getstate().
-
Кодирование и декодирование потоков
Классы StreamWriter и StreamReader предоставляют универсальные рабочие интерфейсы, с помощью которых можно легко реализовать новые подмодули кодирования. Пример того, как это сделать, см. в encodings.utf_8.
Объекты StreamWriter
Класс StreamWriter является подклассом Codec и определяет следующие методы, которые должен реализовать каждый модуль записи в поток, чтобы быть совместимым с реестром кодеков Python.
-
class codecs.StreamWriter(stream, errors='strict') -
Конструктор экземпляра
StreamWriter.Все модули записи в поток должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные именованные аргументы, но реестр кодеков Python использует только аргументы, определённые здесь.
Аргумент stream должен быть файловым объектом, открытым для записи текстовых или двоичных данных в зависимости от конкретного кодека.
StreamWriterможет реализовывать различные схемы обработки ошибок с помощью именованного аргумента errors. Стандартные обработчики ошибок, которые может поддерживать базовый потоковый кодек, см. в разделе Обработчики ошибок.Аргумент errors будет присвоен атрибуту с таким же именем. Присваивание этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок в течение срока существования объекта
StreamWriter.-
write(object) -
Записывает содержимое объекта в поток в закодированном виде.
-
writelines(list) -
Записывает в поток объединённый итерируемый объект строк (возможно, повторно используя метод
write()). Бесконечные или очень большие итерируемые объекты не поддерживаются. Стандартные кодеки «байты-в-байты» не поддерживают этот метод.
-
reset() -
Сбрасывает буферы кодека, используемые для хранения внутреннего состояния.
Вызов этого метода должен обеспечить переход выходных данных в чистое состояние, позволяющее добавлять новые данные без повторного сканирования всего потока для восстановления состояния.
-
Помимо перечисленных выше методов, StreamWriter должен также наследовать все остальные методы и атрибуты базового потока.
Объекты StreamReader
Класс StreamReader является подклассом Codec и определяет следующие методы, которые должен реализовать каждый модуль чтения из потока, чтобы быть совместимым с реестром кодеков Python.
-
class codecs.StreamReader(stream, errors='strict') -
Конструктор экземпляра
StreamReader.Все модули чтения из потока должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные именованные аргументы, но реестр кодеков Python использует только аргументы, определённые здесь.
Аргумент stream должен быть файловым объектом, открытым для чтения текстовых или двоичных данных в зависимости от конкретного кодека.
StreamReaderможет реализовывать различные схемы обработки ошибок с помощью именованного аргумента errors. Стандартные обработчики ошибок, которые может поддерживать базовый потоковый кодек, см. в разделе Обработчики ошибок.Аргумент errors будет присвоен атрибуту с таким же именем. Присваивание этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок в течение срока существования объекта
StreamReader.Набор допустимых значений аргумента errors можно расширить с помощью
register_error().-
read(size=-1, chars=-1, firstline=False) -
Декодирует данные из потока и возвращает полученный объект.
Аргумент chars задаёт количество декодированных кодовых точек или байтов, которое нужно вернуть. Метод
read()никогда не возвращает больше данных, чем было запрошено, но может вернуть меньше, если доступных данных недостаточно.Аргумент size задаёт приблизительное максимальное количество закодированных байтов или кодовых точек, которое нужно прочитать для декодирования. Декодер может изменить это значение при необходимости. Значение по умолчанию -1 означает, что нужно прочитать и декодировать как можно больше данных. Этот параметр предназначен для того, чтобы избежать декодирования огромных файлов за один шаг.
Флаг firstline указывает, что достаточно вернуть только первую строку, если в последующих строках есть ошибки декодирования.
Метод должен использовать жадную стратегию чтения, то есть считывать максимально возможный объём данных в рамках определения кодировки и заданного значения size. Например, если в потоке доступны необязательные завершающие последовательности кодировки или маркеры состояния, их тоже следует считывать.
-
readline(size=None, keepends=True) -
Читает одну строку из входного потока и возвращает декодированные данные.
Если задан аргумент size, он передаётся в качестве аргумента размера методу потока
read().Если значение keepends равно false, символы окончания строк удаляются из возвращаемых строк.
-
readlines(sizehint=None, keepends=True) -
Читает все доступные строки из входного потока и возвращает их в виде списка.
Обработка окончаний строк выполняется методом кодека
decode(); они включаются в элементы списка, если значение keepends равно true.Если задан аргумент sizehint, он передаётся в качестве аргумента size методу потока
read().
-
reset() -
Сбрасывает буферы кодека, используемые для хранения внутреннего состояния.
Обратите внимание, что перемещение по потоку не должно выполняться. Этот метод предназначен главным образом для восстановления после ошибок декодирования.
-
Помимо перечисленных выше методов, StreamReader должен также наследовать все остальные методы и атрибуты базового потока.
Объекты StreamReaderWriter
StreamReaderWriter — это вспомогательный класс, позволяющий оборачивать потоки, поддерживающие как чтение, так и запись.
Конструкция класса позволяет создавать его экземпляр с помощью фабричных функций, возвращаемых функцией lookup().
-
class codecs.StreamReaderWriter(stream, Reader, Writer, errors='strict') -
Создаёт экземпляр
StreamReaderWriter. Аргумент stream должен быть файловым объектом. Аргументы Reader и Writer должны быть фабричными функциями или классами, предоставляющими соответственно интерфейсыStreamReaderиStreamWriter. Обработка ошибок выполняется так же, как определено для модулей чтения и записи в поток.
Экземпляры StreamReaderWriter предоставляют объединённые интерфейсы классов StreamReader и StreamWriter. Они наследуют все остальные методы и атрибуты базового потока.
Объекты StreamRecoder
StreamRecoder преобразует данные из одной кодировки в другую, что иногда полезно при работе с разными средами кодирования.
Конструкция класса позволяет создавать его экземпляр с помощью фабричных функций, возвращаемых функцией lookup().
-
class codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors='strict') -
Создаёт экземпляр
StreamRecoder, реализующий двустороннее преобразование: encode и decode работают на переднем плане — с данными, видимыми коду, вызывающемуread()иwrite(), тогда как Reader и Writer работают на заднем плане — с данными в stream.Эти объекты можно использовать для прозрачного перекодирования, например из Latin-1 в UTF-8 и обратно.
Аргумент stream должен быть файловым объектом.
Аргументы encode и decode должны соответствовать интерфейсу
Codec. Аргументы Reader и Writer должны быть фабричными функциями или классами, предоставляющими объекты, соответствующие интерфейсамStreamReaderиStreamWriter.Обработка ошибок выполняется так же, как определено для модулей чтения и записи в поток.
Экземпляры StreamRecoder предоставляют объединённые интерфейсы классов StreamReader и StreamWriter. Они наследуют все остальные методы и атрибуты базового потока.
Кодировки и Unicode
Строки хранятся внутри как последовательности кодовых точек в диапазоне U+0000–U+10FFFF. (Подробнее о реализации см. в PEP 393.) Когда строковый объект используется за пределами процессора и памяти, важными становятся порядок байтов и способ хранения этих массивов в виде байтов. Как и в случае с другими кодеками, преобразование строки в последовательность байтов называется кодированием, а восстановление строки из последовательности байтов — декодированием. Существует множество кодеков сериализации текста, которые в совокупности называются текстовыми кодировками.
Простейшая текстовая кодировка (называемая 'latin-1' или 'iso-8859-1') сопоставляет кодовые точки 0–255 байтам 0x0–0xff, поэтому строковый объект, содержащий кодовые точки выше U+00FF, невозможно закодировать этим кодеком. Это приведёт к исключению UnicodeEncodeError, которое выглядит следующим образом (хотя детали сообщения об ошибке могут отличаться): UnicodeEncodeError: 'latin-1' codec can't encode character '\u1234' in
position 3: ordinal not in range(256).
Существует и другая группа кодировок (так называемые кодировки charmap), в которых выбирается другое подмножество всех кодовых точек Unicode и задаётся способ сопоставления этих кодовых точек байтам 0x0–0xff. Чтобы увидеть, как это устроено, просто откройте, например, encodings/cp1252.py (кодировку, используемую преимущественно в Windows). Там есть строковая константа из 256 символов, показывающая, какому значению байта соответствует каждый символ.
Все эти кодировки могут кодировать только 256 из 1114112 кодовых точек, определённых в Unicode. Простой и понятный способ хранить каждую кодовую точку Unicode — записывать каждую из них в виде четырёх последовательных байтов. Возможны два варианта: хранить байты в порядке от старшего к младшему или от младшего к старшему. Эти две кодировки называются соответственно UTF-32-BE и UTF-32-LE. Их недостаток заключается в том, что, например, при использовании UTF-32-BE на машине с порядком байтов от младшего к старшему при кодировании и декодировании всегда потребуется менять байты местами. Кодеки Python UTF-16 и UTF-32 избегают этой проблемы, используя собственный порядок байтов платформы, если BOM отсутствует. Python следует сложившейся практике платформ, поэтому данные в собственном порядке байтов преобразуются туда и обратно без избыточной перестановки байтов, хотя по умолчанию стандарт Unicode предписывает порядок от старшего к младшему, если порядок байтов не указан. При чтении этих байтов процессором с другим порядком байтов их необходимо поменять местами. Для определения порядка байтов последовательности байтов UTF-16 или UTF-32 используется BOM («маркер порядка байтов»). Это символ Unicode U+FEFF. Этот символ можно добавлять в начало каждой последовательности байтов UTF-16 или UTF-32. Версия этого символа с переставленными байтами (0xFFFE) является недопустимым символом, который не может встречаться в тексте Unicode. Если первый символ последовательности байтов UTF-16 или UTF-32 — U+FFFE, при декодировании байты необходимо поменять местами.
К сожалению, у символа U+FEFF было и второе назначение: ZERO WIDTH NO-BREAK SPACE — символа, не имеющего ширины и не позволяющего разделить слово. Например, его можно использовать для подсказок алгоритму лигатур. Начиная с Unicode 4.0 использование U+FEFF в качестве ZERO WIDTH NO-BREAK SPACE считается устаревшим (эту роль выполняет U+2060 (WORD JOINER)). Тем не менее программы, работающие с Unicode, должны обрабатывать U+FEFF в обеих ролях: как BOM он служит для определения схемы хранения закодированных байтов и исчезает после декодирования последовательности байтов в строку; как ZERO WIDTH
NO-BREAK SPACE он является обычным символом, который декодируется так же, как любой другой.
Существует ещё одна кодировка, способная кодировать весь диапазон символов Unicode: UTF-8. UTF-8 — это 8-битная кодировка, поэтому в UTF-8 не возникает проблем с порядком байтов. Каждый байт последовательности UTF-8 состоит из двух частей: битов-маркеров (старших битов) и битов полезной нагрузки. Биты-маркеры представляют собой последовательность из нуля—четырёх битов 1, за которыми следует бит 0. Символы Unicode кодируются следующим образом (где x — биты полезной нагрузки, которые в объединённом виде образуют символ Unicode):
Диапазон | Кодирование |
|---|---|
| 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 называет "utf-8-sig") для программы «Блокнот»: перед записью в файл любого символа Unicode записывается BOM в кодировке UTF-8 (в виде последовательности байтов: 0xef, 0xbb, 0xbf). Поскольку маловероятно, что файл в какой-либо кодировке charmap начинается с этих значений байтов (которые, например, соответствовали бы
в iso-8859-1), повышается вероятность того, что кодировку utf-8-sig удастся правильно определить по последовательности байтов. В данном случае BOM используется не для определения порядка байтов, применённого при создании последовательности, а как сигнатура, помогающая определить кодировку. При кодировании кодек utf-8-sig записывает 0xef, 0xbb, 0xbf в качестве первых трёх байтов файла. При декодировании utf-8-sig пропускает эти три байта, если они являются первыми тремя байтами файла. В UTF-8 использование BOM не рекомендуется и его, как правило, следует избегать.
Стандартные кодировки
Python поставляется с рядом встроенных кодеков, реализованных либо в виде функций C, либо с помощью словарей в качестве таблиц отображения. В следующей таблице перечислены кодеки по имени, а также несколько распространённых псевдонимов и языки, для которых, вероятно, используется кодировка. Ни список псевдонимов, ни список языков не являются исчерпывающими. Обратите внимание: варианты написания, отличающиеся только регистром или использованием дефиса вместо подчёркивания, также являются допустимыми псевдонимами, поскольку после нормализации с помощью normalize_encoding() они эквивалентны. Например, 'utf-8' — допустимый псевдоним кодека 'utf_8'.
Примечание
В таблице ниже перечислены наиболее распространённые псевдонимы; полный список см. в исходном файле aliases.py.
В Windows доступны кодеки cpXXX для всех кодовых страниц. Однако на других платформах гарантированно существуют только кодеки, перечисленные в следующей таблице.
Особенность реализации CPython: Некоторые распространённые кодировки могут обходить механизм поиска кодеков для повышения производительности. CPython распознаёт такие возможности оптимизации только для ограниченного набора псевдонимов (без учёта регистра): utf-8, utf8, latin-1, latin1, iso-8859-1, iso8859-1, mbcs (только в Windows), ascii, us-ascii, utf-16, utf16, utf-32, utf32, а также для тех же вариантов с подчёркиваниями вместо дефисов. Использование альтернативных псевдонимов для этих кодировок может привести к замедлению выполнения.
Изменено в версии 3.6: Распознаётся возможность оптимизации для us-ascii.
Многие наборы символов поддерживают одни и те же языки. Они различаются отдельными символами (например, поддерживается ли символ евро) и назначением символов кодовым позициям. В частности, для европейских языков обычно существуют следующие варианты:
- кодировка ISO 8859
- кодовая страница Microsoft Windows, обычно производная от кодировки 8859, но с заменой управляющих символов дополнительными графическими символами
- кодовая страница IBM EBCDIC
- кодовая страница IBM PC, совместимая с ASCII
Кодек | Псевдонимы | Языки |
|---|---|---|
ascii | 646, us-ascii | Английский |
big5 | big5-tw, csbig5 | Традиционный китайский |
big5hkscs | big5-hkscs, hkscs | Традиционный китайский |
cp037 | IBM037, IBM039 | Английский |
cp273 | 273, IBM273, csIBM273 |
Немецкий Добавлено в версии 3.4. |
cp424 | EBCDIC-CP-HE, IBM424 | Иврит |
cp437 | 437, IBM437 | Английский |
cp500 | EBCDIC-CP-BE, EBCDIC-CP-CH, IBM500 | Западная Европа |
cp720 | Арабский | |
cp737 | Греческий | |
cp775 | IBM775 | Балтийские языки |
cp850 | 850, IBM850 | Западная Европа |
cp852 | 852, IBM852 | Центральная и Восточная Европа |
cp855 | 855, IBM855 | Белорусский, болгарский, македонский, русский, сербский |
cp856 | Иврит | |
cp857 | 857, IBM857 | Турецкий |
cp858 | 858, IBM00858 | Западная Европа |
cp860 | 860, IBM860 | Португальский |
cp861 | 861, CP-IS, IBM861 | Исландский |
cp862 | 862, IBM862 | Иврит |
cp863 | 863, IBM863 | Канадский |
cp864 | IBM864 | Арабский |
cp865 | 865, IBM865 | Датский, норвежский |
cp866 | 866, IBM866 | Русский |
cp869 | 869, CP-GR, IBM869 | Греческий |
cp874 | Тайский | |
cp875 | Греческий | |
cp932 | 932, ms932, mskanji, ms-kanji, windows-31j | Японский |
cp949 | 949, ms949, uhc | Корейский |
cp950 | 950, ms950 | Традиционный китайский |
cp1006 | Урду | |
cp1026 | ibm1026 | Турецкий |
cp1125 | 1125, ibm1125, cp866u, ruscii |
Украинский Добавлено в версии 3.4. |
cp1140 | IBM01140 | Западная Европа |
cp1250 | windows-1250 | Центральная и Восточная Европа |
cp1251 | windows-1251 | Белорусский, болгарский, македонский, русский, сербский |
cp1252 | windows-1252 | Западная Европа |
cp1253 | windows-1253 | Греческий |
cp1254 | windows-1254 | Турецкий |
cp1255 | windows-1255 | Иврит |
cp1256 | windows-1256 | Арабский |
cp1257 | windows-1257 | Балтийские языки |
cp1258 | windows-1258 | Вьетнамский |
euc_jp | eucjp, ujis, u-jis | Японский |
euc_jis_2004 | jisx0213, eucjis2004 | Японский |
euc_jisx0213 | eucjisx0213 | Японский |
euc_kr | euckr, korean, ksc5601, ks_c-5601, ks_c-5601-1987, ksx1001, ks_x-1001 | Корейский |
gb2312 | chinese, csiso58gb231280, euc-cn, euccn, eucgb2312-cn, gb2312-1980, gb2312-80, iso-ir-58 | Упрощённый китайский |
gbk | 936, cp936, ms936 | Объединённый китайский |
gb18030 | gb18030-2000 | Объединённый китайский |
hz | hzgb, hz-gb, hz-gb-2312 | Упрощённый китайский |
iso2022_jp | csiso2022jp, iso2022jp, iso-2022-jp | Японский |
iso2022_jp_1 | iso2022jp-1, iso-2022-jp-1 | Японский |
iso2022_jp_2 | iso2022jp-2, iso-2022-jp-2 | Японский, корейский, упрощённый китайский, Западная Европа, греческий |
iso2022_jp_2004 | iso2022jp-2004, iso-2022-jp-2004 | Японский |
iso2022_jp_3 | iso2022jp-3, iso-2022-jp-3 | Японский |
iso2022_jp_ext | iso2022jp-ext, iso-2022-jp-ext | Японский |
iso2022_kr | csiso2022kr, iso2022kr, iso-2022-kr | Корейский |
latin_1 | iso-8859-1, iso8859-1, 8859, cp819, latin, latin1, L1 | Западная Европа |
iso8859_2 | iso-8859-2, latin2, L2 | Центральная и Восточная Европа |
iso8859_3 | iso-8859-3, latin3, L3 | Эсперанто, мальтийский |
iso8859_4 | iso-8859-4, latin4, L4 | Северная Европа |
iso8859_5 | iso-8859-5, cyrillic | Белорусский, болгарский, македонский, русский, сербский |
iso8859_6 | iso-8859-6, arabic | Арабский |
iso8859_7 | iso-8859-7, greek, greek8 | Греческий |
iso8859_8 | iso-8859-8, hebrew | Иврит |
iso8859_9 | iso-8859-9, latin5, L5 | Турецкий |
iso8859_10 | iso-8859-10, latin6, L6 | Скандинавские языки |
iso8859_11 | iso-8859-11, thai | Тайские языки |
iso8859_13 | iso-8859-13, latin7, L7 | Балтийские языки |
iso8859_14 | iso-8859-14, latin8, L8 | Кельтские языки |
iso8859_15 | iso-8859-15, latin9, L9 | Западная Европа |
iso8859_16 | iso-8859-16, latin10, L10 | Юго-Восточная Европа |
johab | cp1361, ms1361 | Корейский |
koi8_r | Русский | |
koi8_t |
Таджикский Добавлено в версии 3.5. | |
koi8_u | Украинский | |
kz1048 | kz_1048, strk1048_2002, rk1048 |
Казахский Добавлено в версии 3.5. |
mac_cyrillic | maccyrillic | Белорусский, болгарский, македонский, русский, сербский |
mac_greek | macgreek | Греческий |
mac_iceland | maciceland | Исландский |
mac_latin2 | maclatin2, maccentraleurope, mac_centeuro | Центральная и Восточная Европа |
mac_roman | macroman, macintosh | Западная Европа |
mac_turkish | macturkish | Турецкий |
ptcp154 | csptcp154, pt154, cp154, cyrillic-asian | Казахский |
shift_jis | csshiftjis, shiftjis, sjis, s_jis | Японский |
shift_jis_2004 | shiftjis2004, sjis_2004, sjis2004 | Японский |
shift_jisx0213 | shiftjisx0213, sjisx0213, s_jisx0213 | Японский |
utf_32 | U32, utf32 | все языки |
utf_32_be | UTF-32BE | все языки |
utf_32_le | UTF-32LE | все языки |
utf_16 | U16, utf16 | все языки |
utf_16_be | UTF-16BE | все языки |
utf_16_le | UTF-16LE | все языки |
utf_7 | U7, unicode-1-1-utf-7 | все языки |
utf_8 | U8, UTF, utf8, cp65001 | все языки |
utf_8_sig | все языки |
Изменено в версии 3.4: Кодировщики utf-16* и utf-32* больше не позволяют кодировать суррогатные кодовые точки (U+D800–U+DFFF). Декодеры utf-32* больше не декодируют последовательности байтов, соответствующие суррогатным кодовым точкам.
Изменено в версии 3.8: cp65001 теперь является псевдонимом utf_8.
Изменено в версии 3.14: В Windows кодеки cpXXX теперь доступны для всех кодовых страниц.
Специфичные для 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. |
Добавлено в версии 3.2: Восстановлены двоичные преобразования.
Изменено в версии 3.4: Восстановлены псевдонимы двоичных преобразований.
Автономные функции кодеков
Следующие функции обеспечивают кодирование и декодирование, подобно кодекам, но недоступны в виде именованных кодеков через codecs.encode() или codecs.decode(). Они используются внутри Python (например, модулем pickle) и работают аналогично кодеку string_escape, удалённому в Python 3.
-
codecs.escape_encode(input, errors=None) -
Кодирует input с помощью escape-последовательностей. Аналогично тому, как
repr()для байтов выводит экранированные значения байтов.input должен быть объектом
bytes.Возвращает кортеж
(output, length), где output — объектbytes, а length — количество обработанных байтов.
-
codecs.escape_decode(input, errors=None) -
Декодирует input, преобразуя escape-последовательности обратно в исходные байты.
input должен быть объектом, подобным байтам.
Возвращает кортеж
(output, length), где output — объектbytes, а length — количество обработанных байтов.
Текстовые преобразования
Следующий кодек выполняет текстовое преобразование: отображение str в str. Оно не поддерживается методом str.encode() (который создаёт только выходные данные типа bytes).
Кодек | Псевдонимы | Описание |
|---|---|---|
rot_13 | rot13 | Возвращает результат шифрования операнда шифром Цезаря. |
Добавлено в версии 3.2: Восстановлено текстовое преобразование rot_13.
Изменено в версии 3.4: Восстановлен псевдоним rot13.
encodings — пакет Encodings
Этот модуль реализует следующие функции:
-
encodings.normalize_encoding(encoding) -
Нормализует имя кодировки encoding.
Нормализация выполняется следующим образом: все неалфавитно-цифровые символы, кроме точки, используемой в именах пакетов Python, объединяются и заменяются одним подчёркиванием; начальные и конечные подчёркивания удаляются. Например,
' -;#'преобразуется в'_'.Обратите внимание, что encoding должен содержать только символы ASCII.
Примечание
Следующие функции не следует использовать напрямую, за исключением целей тестирования; вместо них следует использовать codecs.lookup().
-
encodings.search_function(encoding) -
Ищет модуль кодека, соответствующий заданному имени кодировки encoding.
Сначала эта функция нормализует encoding с помощью
normalize_encoding(), а затем ищет соответствующий псевдоним. Она пытается импортировать модуль кодека из пакета encodings, используя либо псевдоним, либо нормализованное имя. Если модуль найден и определяет допустимую функциюgetregentry(), возвращающую объектcodecs.CodecInfo, кодек кэшируется и возвращается.Если модуль кодека определяет функцию
getaliases(), все возвращённые псевдонимы регистрируются для последующего использования.
-
encodings.win32_code_page_search_function(encoding) -
Ищет кодировку кодовой страницы Windows encoding в формате
cpXXXX.Если кодовая страница допустима и поддерживается, возвращает для неё объект
codecs.CodecInfo.Доступность: Windows.
Добавлено в версии 3.14.
Этот модуль реализует следующее исключение:
-
exception encodings.CodecRegistryError -
Вызывается, если кодек недопустим или несовместим.
encodings.idna — интернационализированные доменные имена в приложениях
Этот модуль реализует RFC 3490 (интернационализированные доменные имена в приложениях) и RFC 3492 (Nameprep: профиль Stringprep для интернационализированных доменных имён (IDN)). Он основан на кодировке punycode и stringprep.
Если вам нужен стандарт IDNA 2008, описанный в RFC 5891 и RFC 5895, используйте сторонний модуль idna.
В совокупности эти RFC определяют протокол для поддержки символов, отличных от ASCII, в доменных именах. Доменное имя, содержащее символы, отличные от ASCII (например, www.Alliancefrançaise.nu), преобразуется в кодировку, совместимую с ASCII (ACE, например, www.xn--alliancefranaise-npb.nu). Затем форма доменного имени ACE используется везде, где протокол не допускает произвольные символы, например в запросах DNS, полях Host HTTP и т. д. Это преобразование выполняется в приложении и, если возможно, незаметно для пользователя: приложение должно прозрачно преобразовывать метки домена Unicode в IDNA при передаче по сети, а метки ACE — обратно в Unicode перед отображением пользователю.
Python поддерживает это преобразование несколькими способами: кодек idna преобразует Unicode в ACE и обратно, разделяя входную строку на метки по символам-разделителям, определённым в разделе 3.1 RFC 3490, и при необходимости преобразуя каждую метку в ACE; обратное преобразование разделяет входную байтовую строку на метки по разделителю . и преобразует все обнаруженные метки ACE в Unicode. Кроме того, модуль socket прозрачно преобразует имена узлов Unicode в ACE, поэтому приложениям не нужно самостоятельно преобразовывать имена узлов при передаче их модулю socket. Помимо этого, модули, принимающие имена узлов в качестве аргументов функций, такие как http.client и ftplib, принимают имена узлов Unicode (http.client также прозрачно передаёт имя узла IDNA в поле Host, если это поле вообще передаётся).
При получении имён узлов из сети (например, при обратном поиске имени) автоматическое преобразование в Unicode не выполняется: приложениям, которые хотят отображать такие имена узлов пользователю, следует декодировать их в Unicode.
Модуль encodings.idna также реализует процедуру nameprep, которая выполняет определённую нормализацию имён узлов, обеспечивая нечувствительность международных доменных имён к регистру и унифицируя похожие символы. При необходимости функции nameprep можно использовать напрямую.
-
encodings.idna.nameprep(label) -
Возвращает версию label, обработанную nameprep. В текущей реализации предполагается, что это строки запросов, поэтому
AllowUnassignedимеет значение true.
-
encodings.idna.ToASCII(label) -
Преобразует метку в ASCII согласно RFC 3490. Предполагается, что
UseSTD3ASCIIRulesимеет значение false.
-
encodings.idna.ToUnicode(label) -
Преобразует метку в Unicode согласно RFC 3490.
encodings.mbcs — кодовая страница ANSI Windows
Этот модуль реализует кодовую страницу ANSI (CP_ACP).
Доступность: Windows.
Изменено в версии 3.2: До версии 3.2 аргумент errors игнорировался; для кодирования всегда использовался 'replace', а для декодирования — 'ignore'.
Изменено в версии 3.3: Добавлена поддержка любых обработчиков ошибок.
encodings.utf_8_sig — кодек UTF-8 с сигнатурой BOM
Этот модуль реализует вариант кодека UTF-8. При кодировании перед байтами в кодировке UTF-8 добавляется BOM в кодировке UTF-8. Для кодировщика с сохранением состояния это выполняется только один раз (при первой записи в байтовый поток). При декодировании необязательный BOM в кодировке UTF-8 в начале данных пропускается.
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/codecs.html