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'удалён.
-
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 для стандартных кодировок можно использовать следующие обработчики ошибок:
Значение | Описание |
|---|---|
| Вызывает |
| Игнорирует некорректные данные и продолжает работу без дополнительных сообщений. Реализовано в |
| Заменяет символом-заменителем. При кодировании используется |
| Заменяет экранированными последовательностями с обратной косой чертой. При кодировании используется шестнадцатеричная форма кодовой точки 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 указывает, что достаточно вернуть только первую строку, если в последующих строках возникают ошибки декодирования.
Метод должен использовать жадную стратегию чтения: читать столько данных, сколько допускают правила кодирования и заданный размер; например, если в потоке присутствуют необязательные завершающие последовательности или маркеры состояния, их также следует прочитать.
-
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 на машине с порядком байтов от младшего к старшему при кодировании и декодировании всегда придётся менять порядок байтов. UTF-32 позволяет избежать этой проблемы: байты всегда хранятся в естественном порядке байтов. Однако при чтении этих байтов процессором с другим порядком байтов их всё же придётся переставить. Чтобы определить порядок байтов последовательности байтов 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.
Особенность реализации 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, 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, windows-31j | Японский |
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_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.
Специальные кодировки Python
Некоторые предопределённые кодеки предназначены специально для Python, поэтому их имена не имеют значения за пределами Python. Они перечислены в таблицах ниже в соответствии с ожидаемыми типами входных и выходных данных (обратите внимание: хотя кодеки чаще всего используются для кодирования текста, базовая инфраструктура кодеков поддерживает произвольные преобразования данных, а не только кодирование текста). Для асимметричных кодеков указанное описание относится к направлению кодирования.
Кодировки текста
Следующие кодеки обеспечивают кодирование str в bytes и декодирование объекта, подобного 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. Они не поддерживаются методом bytes.decode() (который создаёт только выходные данные типа str).
Кодек | Псевдонимы | Значение | Кодировщик / декодер |
|---|---|---|---|
base64_codec [1] | base64, base_64 |
Преобразует операнд в многострочный формат MIME base64 (результат всегда содержит завершающий Изменено в версии 3.4: принимает любые объекты, подобные bytes в качестве входных данных для кодирования и декодирования | |
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(). Они используются внутри системы (например, в 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 должен быть объектом, подобным bytes.
Возвращает кортеж
(output, length), где output — объектbytes, а length — количество обработанных байтов.
Текстовые преобразования
Следующий кодек выполняет текстовое преобразование: сопоставление str с str. Он не поддерживается методом str.encode() (который создаёт только выходные данные типа bytes).
Кодек | Псевдонимы | Значение |
|---|---|---|
rot_13 | rot13 | Возвращает результат шифрования операнда шифром Цезаря. |
Добавлено в версии 3.2: Восстановлено текстовое преобразование rot_13.
Изменено в версии 3.4: Восстановлен псевдоним rot13.
encodings — пакет кодировок
Этот модуль реализует следующие функции:
-
encodings.normalize_encoding(encoding) -
Нормализует имя кодировки encoding.
При нормализации все неалфавитно-цифровые символы, кроме точки, используемой в именах пакетов Python, объединяются и заменяются одним символом подчёркивания; начальные и конечные подчёркивания удаляются. Например,
' -;#'становится'_'.Обратите внимание: encoding должен состоять только из символов ASCII.
Примечание
Следующую функцию не следует использовать напрямую, за исключением целей тестирования; вместо неё следует использовать codecs.lookup().
-
encodings.search_function(encoding) -
Выполняет поиск модуля кодека, соответствующего указанному имени кодировки encoding.
Сначала эта функция нормализует encoding с помощью
normalize_encoding(), а затем ищет соответствующий псевдоним. Она пытается импортировать модуль кодека из пакета encodings, используя псевдоним или нормализованное имя. Если модуль найден и определяет допустимую функциюgetregentry(), возвращающую объектcodecs.CodecInfo, кодек кэшируется и возвращается.Если модуль кодека определяет функцию
getaliases(), все возвращённые псевдонимы регистрируются для дальнейшего использования.
Этот модуль реализует следующее исключение:
-
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) -
Возвращает результат применения nameprep к 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.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–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/codecs.html