codecs — Реестр кодеков и базовые классы
Этот модуль определяет базовые классы для стандартных кодеков Python (кодировщики и декодировщики) и предоставляет доступ к внутреннему реестру кодеков Python, который управляет процессом поиска кодеков и обработки ошибок.
Он определяет следующие функции:
-
codecs.encode(obj[, encoding[, errors]]) -
Кодирует obj с использованием кодека, зарегистрированного для encoding. По умолчанию используется кодировка
'ascii'.Errors можно указать для настройки желаемой схемы обработки ошибок. По умолчанию используется обработчик ошибок
'strict', что означает, что ошибки кодирования вызываютValueError(или более специализированный подкласс кодека, такой какUnicodeEncodeError). Для получения дополнительной информации о обработке ошибок кодеков обратитесь к Базовые классы кодеков.Новое в версии 2.4.
-
codecs.decode(obj[, encoding[, errors]]) -
Декодирует obj с использованием кодека, зарегистрированного для encoding. По умолчанию используется кодировка
'ascii'.Errors можно указать для настройки желаемой схемы обработки ошибок. По умолчанию используется обработчик ошибок
'strict', что означает, что ошибки декодирования вызываютValueError(или более специализированный подкласс кодека, такой какUnicodeDecodeError). Для получения дополнительной информации о обработке ошибок кодеков обратитесь к Базовые классы кодеков.Новое в версии 2.4.
-
codecs.register(search_function) -
Регистрирует функцию поиска кодеков. Функции поиска ожидают один аргумент — имя кодировки в нижнем регистре, и возвращают объект
CodecInfo, имеющий следующие атрибуты:-
nameИмя кодировки; -
encodeБессостоятельная функция кодирования; -
decodeБессостоятельная функция декодирования; -
incrementalencoderКласс или функция-фабрика для инкрементального кодировщика; -
incrementaldecoderКласс или функция-фабрика для инкрементального декодировщика; -
streamwriterКласс или функция-фабрика для потокового записи; -
streamreaderКласс или функция-фабрика для потокового чтения.
Различные функции или классы принимают следующие аргументы:
encode и decode: Эти функции или методы должны иметь тот же интерфейс, что и методы
encode()/decode()экземпляров Codec (см. Интерфейс Codec). Ожидается, что функции/методы будут работать в бессостоятельном режиме.incrementalencoder и incrementaldecoder: Это функции-фабрики, предоставляющие следующий интерфейс:
factory(errors='strict')Функции-фабрики должны возвращать объекты, предоставляющие интерфейсы, определенные базовыми классами
IncrementalEncoderиIncrementalDecoderсоответственно. Инкрементальные кодеки могут сохранять состояние.streamreader и streamwriter: Эти функции-фабрики должны предоставлять следующий интерфейс:
factory(stream, errors='strict')Функции-фабрики должны возвращать объекты, предоставляющие интерфейсы, определенные базовыми классами
StreamReaderиStreamWriterсоответственно. Потоковые кодеки могут сохранять состояние.Возможные значения для ошибок:
-
'strict': вызывать исключение в случае ошибки кодирования -
'replace': заменять некорректные данные подходящим маркером замены, например'?'или'\ufffd' -
'ignore': игнорировать некорректные данные и продолжать без дальнейших уведомлений -
'xmlcharrefreplace': заменить соответствующей ссылкой на символ XML (только для кодирования) -
'backslashreplace': заменить обратными косыми слешами (только для кодирования)
а также любые другие имена обработки ошибок, определенные через
register_error().В случае, если функция поиска не может найти заданную кодировку, она должна вернуть
None. -
-
codecs.lookup(encoding) -
Ищет информацию о кодеке в реестре кодеков Python и возвращает объект
CodecInfoкак определено выше.Кодировки сначала ищутся в кэше реестра. Если не найдено, сканируется список зарегистрированных функций поиска. Если объект
CodecInfoне найден, генерируетсяLookupError. В противном случае, объектCodecInfoсохраняется в кэше и возвращается вызывающей стороне.
Для упрощения доступа к различным кодекам, модуль предоставляет эти дополнительные функции, которые используют lookup() для поиска кодека:
-
codecs.getencoder(encoding) -
Ищет кодек для данной кодировки и возвращает его функцию кодирования.
Вызывает
LookupErrorв случае, если кодировка не найдена.
-
codecs.getdecoder(encoding) -
Ищет кодек для данной кодировки и возвращает его функцию декодирования.
Вызывает
LookupErrorв случае, если кодировка не найдена.
-
codecs.getincrementalencoder(encoding) -
Ищет кодек для данной кодировки и возвращает его класс или функцию-фабрику для инкрементального кодировщика.
Вызывает
LookupErrorв случае, если кодировка не найдена или кодек не поддерживает инкрементального кодировщика.Новое в версии 2.5.
-
codecs.getincrementaldecoder(encoding) -
Ищет кодек для данной кодировки и возвращает его класс или функцию-фабрику для инкрементального декодировщика.
Вызывает
LookupErrorв случае, если кодировка не найдена или кодек не поддерживает инкрементального декодировщика.Новое в версии 2.5.
-
codecs.getreader(encoding) -
Ищет кодек для данной кодировки и возвращает его класс или функцию-фабрику StreamReader.
Вызывает
LookupErrorв случае, если кодировка не найдена.
-
codecs.getwriter(encoding) -
Ищет кодек для данной кодировки и возвращает его класс или функцию-фабрику StreamWriter.
Вызывает
LookupErrorв случае, если кодировка не найдена.
-
codecs.register_error(name, error_handler) -
Регистрирует функцию обработки ошибок error_handler под именем name. error_handler будет вызываться во время кодирования и декодирования в случае ошибки, когда name указан как параметр errors.
Для кодирования error_handler будет вызван с экземпляром
UnicodeEncodeError, который содержит информацию о местоположении ошибки. Обработчик ошибок должен либо вызвать это, либо другое исключение, либо вернуть кортеж со заменой для некодируемой части входных данных и позицией, с которой следует продолжить кодирование. Кодировщик закодирует замену и продолжит кодирование исходных данных с указанной позиции. Отрицательные значения позиции будут обрабатываться как относительные к концу входной строки. Если полученная позиция выходит за пределы границ, будет вызваноIndexError.Декодирование и преобразование работают аналогично, за исключением того, что
UnicodeDecodeErrorилиUnicodeTranslateErrorбудут переданы в обработчик, а замена от обработчика ошибок будет помещена непосредственно в выходные данные.
-
codecs.lookup_error(name) -
Возвращает обработчик ошибок, ранее зарегистрированный под именем name.
Вызывает
LookupErrorв случае, если обработчик не найден.
-
codecs.strict_errors(exception) -
Реализует обработку ошибок
strict: любая ошибка кодирования или декодирования вызываетUnicodeError.
-
codecs.replace_errors(exception) -
Реализует обработку ошибок
replace: неверные данные заменяются подходящим символом, например'?'в строках байтов и'\ufffd'в строках Юникода.
-
codecs.ignore_errors(exception) -
Реализует обработку ошибок
ignore: неверные данные игнорируются, и кодирование или декодирование продолжаются без дальнейших уведомлений.
-
codecs.xmlcharrefreplace_errors(exception) -
Реализует обработку ошибок
xmlcharrefreplace(только для кодирования): некодируемый символ заменяется соответствующей ссылкой XML.
-
codecs.backslashreplace_errors(exception) -
Реализует обработку ошибок
backslashreplace(только для кодирования): некодируемый символ заменяется обратной косой чертой со знаком escape.
Для упрощения работы с закодированными файлами или потоками модуль также определяет эти служебные функции:
-
codecs.open(filename, mode[, encoding[, errors[, buffering]]]) -
Открывает закодированный файл, используя заданный режим, и возвращает обернутую версию, обеспечивающую прозрачное кодирование/декодирование. По умолчанию режим файла
'r', что означает открытие файла в режиме чтения.Примечание
Обернутая версия будет принимать только формат объекта, определённый кодеками, т. е. объекты Юникода для большинства встроенных кодеков. Вывод также зависит от кодека и обычно также будет Юникодом.
Примечание
Файлы всегда открываются в двоичном режиме, даже если не был указан двоичный режим. Это делается для предотвращения потери данных из-за кодировок, использующих 8-битные значения. Это означает, что автоматическое преобразование
'\n'при чтении и записи не выполняется.encoding указывает кодировку, которая должна использоваться для файла.
errors можно задать для определения обработки ошибок. По умолчанию
'strict'вызываетValueErrorв случае возникновения ошибки кодирования.buffering имеет то же значение, что и для встроенной функции
open(). По умолчанию буферизация по строкам.
-
codecs.EncodedFile(file, input[, output[, errors]]) -
Возвращает обернутую версию файла, обеспечивающую прозрачный перевод кодирования.
Строки, написанные в обернутый файл, интерпретируются в соответствии с заданной кодировкой input, а затем записываются в исходный файл в виде строк, используя кодировку output. Промежуточной кодировкой обычно будет Юникод, но зависит от указанных кодеков.
Если output не задан, он по умолчанию равен input.
errors можно задать для определения обработки ошибок. По умолчанию
'strict', что вызываетValueErrorв случае возникновения ошибки кодирования.
-
codecs.iterencode(iterable, encoding[, errors]) -
Использует инкрементный кодировщик для итеративного кодирования входных данных, предоставляемых iterable. Эта функция является генератором. errors (а также любой другой ключевой аргумент) передаётся инкременному кодировщику.
Новое в версии 2.5.
-
codecs.iterdecode(iterable, encoding[, errors]) -
Использует инкрементный декодер для итеративного декодирования входных данных, предоставляемых iterable. Эта функция является генератором. errors (а также любой другой ключевой аргумент) передаётся инкременному декодеру.
Новое в версии 2.5.
Модуль также предоставляет следующие константы, которые полезны для чтения и записи в файлы, зависящие от платформы:
-
codecs.BOM -
codecs.BOM_BE -
codecs.BOM_LE -
codecs.BOM_UTF8 -
codecs.BOM_UTF16 -
codecs.BOM_UTF16_BE -
codecs.BOM_UTF16_LE -
codecs.BOM_UTF32 -
codecs.BOM_UTF32_BE -
codecs.BOM_UTF32_LE -
Эти константы определяют различные кодировки метки порядка байтов (BOM) Юникода, используемые в потоках UTF-16 и UTF-32, чтобы указать порядок байтов, используемых в потоке или файле, и в UTF-8 в качестве подписи Юникода.
BOM_UTF16это либоBOM_UTF16_BE, либоBOM_UTF16_LEв зависимости от родного порядка байтов платформы,BOM— псевдоним дляBOM_UTF16,BOM_LEдляBOM_UTF16_LEиBOM_BEдляBOM_UTF16_BE. Другие представляют BOM в кодировках UTF-8 и UTF-32.
1. Базовые классы кодеков
Модуль codecs определяет набор базовых классов, которые определяют интерфейс и также могут быть использованы для лёгкого написания собственных кодеков для использования в Python.
Каждый кодек должен определить четыре интерфейса, чтобы сделать его пригодным в качестве кодека в Python: бессостоятельный кодировщик, бессостоятельный декодер, поток-читатель и поток-писатель. Потоковый читатель и писатель обычно повторно используют бессостоятельные кодировщик/декодер для реализации протоколов файлов.
Класс Codec определяет интерфейс для бессостоятельных кодировщиков/декодеров.
Для упрощения и стандартизации обработки ошибок методы encode() и decode() могут реализовывать различные схемы обработки ошибок, предоставляя строковый аргумент errors. Следующие строковые значения определены и реализованы всеми стандартными кодеками Python:
Значение | Значение |
|---|---|
| Вызывает |
| Игнорирует символ и продолжает с последующим. |
| Заменяет подходящим замещающим символом; Python будет использовать официальный символ замены U+FFFD для встроенных кодеков Юникода при декодировании и ‘?’ при кодировании. |
| Заменяет соответствующей ссылкой XML (только для кодирования). |
| Заменяет последовательностью обратной косой черты со знаком escape (только для кодирования). |
Множество разрешённых значений может быть расширено через register_error().
1.1. Объекты кодеков
Класс Codec определяет эти методы, которые также определяют функциональные интерфейсы бессостоятельного кодировщика и декодера:
-
Codec.encode(input[, errors]) -
Кодирует объект input и возвращает кортеж (объект output, длина, потреблённая). Хотя кодеки не ограничены использованием с Юникодом, в контексте Юникода кодирование преобразует объект Юникода в обычную строку, используя кодировку набора символов (например,
cp1252илиiso-8859-1).errors определяет используемую обработку ошибок. По умолчанию используется обработка
'strict'.Метод не может хранить состояние в экземпляре
Codec. ИспользуйтеStreamWriterдля кодеков, которые должны хранить состояние, чтобы кодирование было эффективным.Кодировщик должен уметь обрабатывать вход нулевой длины и возвращать пустой объект типа выходного объекта в этой ситуации.
-
Codec.decode(input[, errors]) -
Декодирует объект input и возвращает кортеж (объект output, длина, потреблённая). В контексте Юникода декодирование преобразует обычную строку, закодированную с использованием кодировки набора символов, в объект Юникода.
input должен быть объектом, предоставляющим слот буфера
bf_getreadbuf. Примеры объектов, предоставляющих этот слот: строки Python, объекты буферов и файлы с отображением памяти.errors определяет используемую обработку ошибок. По умолчанию используется обработка
'strict'.Метод не может хранить состояние в экземпляре
Codec. ИспользуйтеStreamReaderдля кодеков, которые должны хранить состояние, чтобы декодирование было эффективным.Декодер должен уметь обрабатывать вход нулевой длины и возвращать пустой объект типа выходного объекта в этой ситуации.
Классы IncrementalEncoder и IncrementalDecoder предоставляют базовый интерфейс для инкрементного кодирования и декодирования. Кодирование/декодирование входных данных выполняется не одним вызовом бессостоятельного кодировщика/декодировщика, а несколькими вызовами метода encode()/decode() инкрементного кодировщика/декодировщика. Инкрементный кодировщик/декодировщик отслеживает процесс кодирования/декодирования во время вызовов методов.
Объединённый результат вызовов метода encode()/decode() эквивалентен результату, если все отдельные входные данные были объединены в один, а затем закодированы/декодированы бессостоятельным кодировщиком/декодировщиком.
1.2. Объекты IncrementalEncoder
Введено в версии 2.5.
Класс IncrementalEncoder используется для кодирования входных данных по частям. Он определяет следующие методы, которые каждый инкрементный кодировщик должен определить для совместимости с реестром кодеков Python.
-
class codecs.IncrementalEncoder([errors]) -
Конструктор объекта
IncrementalEncoder.Все инкрементные кодировщики должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только те, что определены здесь, используются реестром кодеков Python.
Класс
IncrementalEncoderможет реализовывать различные схемы обработки ошибок, предоставляя ключевой аргумент errors. Эти параметры предопределены:-
'strict'ВызватьValueError(или подкласс); это значение по умолчанию. -
'ignore'Пропустить символ и продолжить с последующим. -
'replace'Заменить подходящим символом-заменителем. -
'xmlcharrefreplace'Заменить соответствующей XML-ссылкой на символ. -
'backslashreplace'Заменить экранированными последовательностями с обратным слэшем.
Аргумент errors будет присвоен атрибуту с тем же именем. Присвоение этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок в течение жизненного цикла объекта
IncrementalEncoder.Множество допустимых значений для аргумента errors может быть расширено с помощью
register_error().-
encode(object[, final]) -
Кодирует object (учитывая текущее состояние кодировщика) и возвращает закодированный объект. Если это последний вызов
encode(), final должно быть истинно (по умолчанию ложно).
-
reset() -
Сбросить кодировщик в исходное состояние.
-
1.3. Объекты IncrementalDecoder
Класс IncrementalDecoder используется для декодирования входных данных по частям. Он определяет следующие методы, которые каждый инкрементный декодер должен определить для совместимости с реестром кодеков Python.
-
class codecs.IncrementalDecoder([errors]) -
Конструктор объекта
IncrementalDecoder.Все инкрементные декодеры должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только те, что определены здесь, используются реестром кодеков Python.
Класс
IncrementalDecoderможет реализовывать различные схемы обработки ошибок, предоставляя ключевой аргумент errors. Эти параметры предопределены:-
'strict'ВызватьValueError(или подкласс); это значение по умолчанию. -
'ignore'Пропустить символ и продолжить с последующим. -
'replace'Заменить подходящим символом-заменителем.
Аргумент errors будет присвоен атрибуту с тем же именем. Присвоение этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок в течение жизненного цикла объекта
IncrementalDecoder.Множество допустимых значений для аргумента errors может быть расширено с помощью
register_error().-
decode(object[, final]) -
Декодирует object (учитывая текущее состояние декодера) и возвращает декодированный объект. Если это последний вызов
decode(), final должно быть истинно (по умолчанию ложно). Если final истинно, декодер должен полностью декодировать входные данные и сбросить все буферы. Если это невозможно (например, из-за неполных последовательностей байтов в конце входных данных), он должен инициировать обработку ошибок, как и в бессостоятельном случае (что может вызвать исключение).
-
reset() -
Сбросить декодер в исходное состояние.
-
Классы StreamWriter и StreamReader предоставляют общие интерфейсы работы, которые можно использовать для очень лёгкой реализации новых подмодулей кодирования. См. encodings.utf_8 для примера.
1.4. Объекты StreamWriter
Класс StreamWriter является подклассом Codec и определяет следующие методы, которые каждый поток-писатель должен определить для совместимости с реестром кодеков Python.
-
class codecs.StreamWriter(stream[, errors]) -
Конструктор объекта
StreamWriter.Все потоки-писатели должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только те, что определены здесь, используются реестром кодеков Python.
stream должен быть объектом, подобным файлу, открытым для записи бинарных данных.
Класс
StreamWriterможет реализовывать различные схемы обработки ошибок, предоставляя ключевой аргумент errors. Эти параметры предопределены:-
'strict'ВызватьValueError(или подкласс); это значение по умолчанию. -
'ignore'Пропустить символ и продолжить с последующим. -
'replace'Заменить подходящим символом-заменителем. -
'xmlcharrefreplace'Заменить соответствующей XML-ссылкой на символ. -
'backslashreplace'Заменить экранированными последовательностями с обратным слэшем.
Аргумент errors будет присвоен атрибуту с тем же именем. Присвоение этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок в течение жизненного цикла объекта
StreamWriter.Множество допустимых значений для аргумента errors может быть расширено с помощью
register_error().-
write(object) -
Записывает содержимое объекта, закодированное в поток.
-
writelines(list) -
Записывает конкатенированный список строк в поток (возможно, повторно используя метод
write()).
-
reset() -
Сбрасывает и очищает буферы кодека, используемые для сохранения состояния.
Вызов этого метода должен гарантировать, что данные на выходе находятся в чистом состоянии, которое позволяет добавлять новые свежие данные без необходимости повторного сканирования всего потока для восстановления состояния.
-
В дополнение к вышеперечисленным методам, StreamWriter также должен наследовать все другие методы и атрибуты от базового потока.
1.5. Объекты StreamReader
Класс StreamReader является подклассом Codec и определяет следующие методы, которые каждый поток-читатель должен определить для совместимости с реестром кодеков Python.
-
class codecs.StreamReader(stream[, errors]) -
Конструктор для экземпляра
StreamReader.Все читатели потоков должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только те, которые определены здесь, используются реестром кодировок Python.
stream должен быть объектом, похожим на файл, открытым для чтения (бинарных) данных.
Класс
StreamReaderможет реализовывать различные схемы обработки ошибок, предоставляя ключевой аргумент errors. Эти параметры определены:-
'strict'ВызватьValueError(или подкласс); это значение по умолчанию. -
'ignore'Пропустить символ и продолжить с последующим. -
'replace'Заменить подходящим символом-заменителем.
Аргумент errors будет назначен атрибуту с таким же именем. Назначение этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок в течение жизненного цикла объекта
StreamReader.Набор допустимых значений для аргумента errors может быть расширен с помощью
register_error().-
read([size[, chars[, firstline]]]) -
Декодирует данные из потока и возвращает результирующий объект.
chars указывает количество символов для чтения из потока.
read()никогда не вернёт более chars символов, но может вернуть меньше, если доступных символов недостаточно.size указывает приблизительное максимальное количество байтов для чтения из потока в целях декодирования. Декодер может изменить это значение по мере необходимости. Значение по умолчанию -1 указывает на чтение и декодирование максимально возможного количества. size предназначен для предотвращения декодирования огромных файлов за один шаг.
firstline указывает, что достаточно вернуть только первую строку, если ошибки декодирования возникают в последующих строках.
Метод должен использовать стратегию жадного чтения, подразумевающую чтение максимального количества данных, разрешенных кодировкой и заданным размером, например, если на потоке доступны необязательные окончания кодировки или маркеры состояния, они также должны быть прочитаны.
Изменено в версии 2.4: Добавлен аргумент chars.
Изменено в версии 2.4.2: Добавлен аргумент firstline.
-
readline([size[, keepends]]) -
Прочитать одну строку из входного потока и вернуть закодированные данные.
Если задано size, оно передается как аргумент size методу
read()потока.Если keepends ложно, окончания строк будут удалены из возвращаемых строк.
Изменено в версии 2.4: Добавлен аргумент keepends.
-
readlines([sizehint[, keepends]]) -
Прочитать все доступные строки из входного потока и вернуть их в виде списка строк.
Окончания строк реализуются с помощью метода декодера кодировки и включаются в записи списка, если keepends истинно.
Если задано sizehint, оно передаётся в качестве аргумента size методу
read()потока.
-
reset() -
Сбрасывает буферы кодировки, используемые для сохранения состояния.
Обратите внимание, что никакого перемещения потока не должно происходить. Этот метод предназначен в первую очередь для возможности восстановления после ошибок декодирования.
-
Помимо перечисленных методов, класс StreamReader также должен наследовать все остальные методы и атрибуты от базового потока.
Следующие два базовых класса включены для удобства. Они не требуются реестром кодировок, но могут быть полезны на практике.
1.6. Объекты StreamReaderWriter
Класс StreamReaderWriter позволяет оборачивать потоки, которые работают в режимах чтения и записи.
Конструкции такие, что можно использовать функции-фабрики, возвращаемые функцией lookup(), для создания экземпляра.
-
class codecs.StreamReaderWriter(stream, Reader, Writer, errors) -
Создаёт экземпляр
StreamReaderWriter. stream должен быть объектом, похожим на файл. Reader и Writer должны быть функциями-фабриками или классами, предоставляющими интерфейсStreamReaderиStreamWriterсоответственно. Обработка ошибок осуществляется так же, как определено для читателей и писателей потоков.
Экземпляры StreamReaderWriter определяют объединённые интерфейсы классов StreamReader и StreamWriter. Они наследуют все остальные методы и атрибуты от базового потока.
1.7. Объекты StreamRecoder
Класс StreamRecoder предоставляет представление «фронтенд — бэкенд» для кодирования данных, что иногда полезно при работе с различными средами кодирования.
Конструкции такие, что можно использовать функции-фабрики, возвращаемые функцией lookup(), для создания экземпляра.
-
class codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors) -
Создаёт экземпляр
StreamRecoder, который реализует двустороннее преобразование: encode и decode работают с фронтендом (входом вread()и выходом изwrite()), а Reader и Writer — с бэкендом (чтением и записью в поток).Эти объекты можно использовать для прозрачного прямого перекодирования, например, из Latin-1 в UTF-8 и обратно.
stream должен быть объектом, похожим на файл.
encode, decode должны соответствовать интерфейсу
Codec. Reader, Writer должны быть функциями-фабриками или классами, предоставляющими объекты интерфейсаStreamReaderиStreamWriterсоответственно.encode и decode необходимы для преобразования на фронтенде, Reader и Writer — для преобразования на бэкенде. Промежуточный формат определяется двумя наборами кодировок, например, кодировки Unicode используют Unicode в качестве промежуточной кодировки.
Обработка ошибок выполняется так же, как и для читателей и писателей потоков.
Экземпляры StreamRecoder определяют объединённые интерфейсы классов StreamReader и StreamWriter. Они наследуют все остальные методы и атрибуты от базового потока.
2. Обзор кодировок и Unicode
Строки Unicode хранятся во внутреннем представлении как последовательности кодовых точек (точнее, как массивы Py_UNICODE). В зависимости от способа компиляции Python (через --enable-unicode=ucs2 или --enable-unicode=ucs4, причём первый — по умолчанию) Py_UNICODE является либо 16-битным, либо 32-битным типом данных. После использования объекта Unicode вне ЦП и памяти возникает проблема с порядком байтов ЦП и способом хранения этих массивов в виде байтов. Преобразование объекта Unicode в последовательность байтов называется кодированием, а восстановление объекта Unicode из последовательности байтов — декодированием. Существует множество различных методов такого преобразования (эти методы также называются кодировками). Самый простой метод заключается в сопоставлении кодовых точек 0–255 с байтами 0x0–0xff. Это означает, что объект Unicode, содержащий кодовые точки выше U+00FF, не может быть закодирован этим методом (который называется 'latin-1' или 'iso-8859-1'). unicode.encode() сгенерирует исключение UnicodeEncodeError, которое выглядит так: UnicodeEncodeError: 'latin-1'
codec can't encode character u'\u1234' in position 3: ordinal not in
range(256).
Существует ещё одна группа кодировок (так называемые кодировки charmap), которые выбирают другой подмножество всех кодовых точек Unicode и способ сопоставления этих кодовых точек с байтами 0x0–0xff. Чтобы увидеть, как это выполняется, просто откройте, например, encodings/cp1252.py (это кодировка, используемая в основном в Windows). Там есть строковая константа с 256 символами, которая показывает, какой символ сопоставлен с каким значением байта.
Все эти кодировки могут кодировать только 256 из 1114112 кодовых точек, определенных в Unicode. Простой и прямой способ хранения каждой кодовой точки — хранить каждую кодовую точку как четыре последовательных байта. Есть два варианта: хранить байты в порядке big endian или little endian. Эти две кодировки называются UTF-32-BE и UTF-32-LE соответственно. Их недостаток заключается в том, что, например, если вы используете UTF-32-BE на машине с little endian, вам всегда нужно будет переставлять байты при кодировании и декодировании. UTF-32 устраняет эту проблему: байты всегда будут в естественном порядке следования байтов. Однако, если эти байты будут считываться процессором с другим порядком следования байтов, то байты нужно будет переставить. Чтобы можно было определить порядок следования байтов в последовательности байтов UTF-16 или UTF-32, существует так называемый BOM («Byte Order Mark»). Это символ 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 — это способ определения структуры хранения закодированных байтов, и он исчезает после того, как последовательность байтов была декодирована в строку Unicode; в качестве 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 в декодированной строке Unicode (даже если это первый символ) обрабатывается как ZERO WIDTH NO-BREAK SPACE.
Без внешней информации невозможно надежно определить, какая кодировка использовалась для кодирования строки Unicode. Каждая кодировка charmap может декодировать любую случайную последовательность байтов. Однако это невозможно с UTF-8, так как последовательности байтов UTF-8 имеют структуру, которая не допускает произвольных последовательностей байтов. Для повышения надежности определения кодировки UTF-8 Microsoft придумала вариант UTF-8 (который Python 2.5 называет "utf-8-sig") для своей программы «Блокнот»: перед записью любого символа Unicode в файл записывается UTF-8 кодированный BOM (который выглядит как последовательность байтов: 0xef, 0xbb, 0xbf). Поскольку маловероятно, что любой файл, закодированный с помощью charmap, начнётся с этих значений байтов (которые, например, соответствуют
в iso-8859-1), это повышает вероятность того, что кодировка utf-8-sig может быть правильно определена по последовательности байтов. Таким образом, здесь BOM используется не для определения порядка следования байтов при формировании последовательности байтов, а как подпись, которая помогает определить кодировку. При кодировании кодек utf-8-sig запишет 0xef, 0xbb, 0xbf в качестве первых трёх байтов в файл. При декодировании utf-8-sig пропустит эти три байта, если они появятся в качестве первых трёх байтов в файле. В UTF-8 использование BOM не рекомендуется и его следует избегать в целом.
3. Стандартные кодировки
Python поставляется с рядом встроенных кодеков, реализованных как C-функции или с помощью словарей в качестве таблиц соответствий. В следующей таблице перечислены кодеки по имени, вместе с некоторыми общими псевдонимами и языками, для которых кодировка, вероятно, используется. Ни список псевдонимов, ни список языков не являются исчерпывающими. Обратите внимание, что альтернативы написания, отличающиеся только регистром или использованием дефиса вместо подчеркивания, также являются допустимыми псевдонимами; поэтому, например, 'utf-8' является допустимым псевдонимом для кодека 'utf_8'.
Многие наборы символов поддерживают одни и те же языки. Они различаются по отдельным символам (например, поддерживается ли символ «ЕВРО» или нет) и по назначению символов в кодовых позициях. В частности, для европейских языков обычно существуют следующие варианты:
- набор символов 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 | Английский |
cp424 | EBCDIC-CP-HE, IBM424 | Иврит |
cp437 | 437, IBM437 | Английский |
cp500 | EBCDIC-CP-BE, EBCDIC-CP-CH, IBM500 | Западная Европа |
cp720 | Арабский | |
cp737 | Греческий | |
cp775 | IBM775 | Балтийские языки |
cp850 | 850, IBM850 | Западная Европа |
cp852 | 852, IBM852 | Центральная и Восточная Европа |
cp855 | 855, IBM855 | Болгарский, Белорусский, Македонский, Русский, Сербский |
cp856 | Иврит | |
cp857 | 857, IBM857 | Турецкий |
cp858 | 858, IBM858 | Западная Европа |
cp860 | 860, IBM860 | Португальский |
cp861 | 861, CP-IS, IBM861 | Исландский |
cp862 | 862, IBM862 | Иврит |
cp863 | 863, IBM863 | Канадский |
cp864 | IBM864 | Арабский |
cp865 | 865, IBM865 | Датский, Норвежский |
cp866 | 866, IBM866 | Русский |
cp869 | 869, CP-GR, IBM869 | Греческий |
cp874 | Тайский | |
cp875 | Греческий | |
cp932 | 932, ms932, mskanji, ms-kanji | Японский |
cp949 | 949, ms949, uhc | Корейский |
cp950 | 950, ms950 | Традиционный китайский |
cp1006 | Урду | |
cp1026 | ibm1026 | Турецкий |
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_u | Украинский | |
mac_cyrillic | maccyrillic | Болгарский, Белорусский, Македонский, Русский, Сербский |
mac_greek | macgreek | Греческий |
mac_iceland | maciceland | Исландский |
mac_latin2 | maclatin2, maccentraleurope | Центральная и Восточная Европа |
mac_roman | macroman | Западная Европа |
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 | все языки (только BMP) |
utf_16_le | UTF-16LE | все языки (только BMP) |
utf_7 | U7, unicode-1-1-utf-7 | все языки |
utf_8 | U8, UTF, utf8 | все языки |
utf_8_sig | все языки |
4. Python Специфичные Кодеки
Ряд предопределённых кодеков специфичны для Python, поэтому их имена кодеков не имеют смысла вне Python. Эти кодеки перечислены в таблицах ниже в зависимости от ожидаемых типов входных и выходных данных (обратите внимание, что, хотя кодировки текста являются наиболее распространённым случаем использования кодеков, базовая инфраструктура кодеков поддерживает произвольные преобразования данных, а не только кодировки текста).
Следующие кодеки обеспечивают кодирование unicode-to-str 1 и декодирование str-to-unicode 2, аналогично кодировкам Unicode текста.
Кодек | Псевдонимы | Назначение |
|---|---|---|
idna | Реализует RFC 3490, см. также | |
mbcs | dbcs | Только Windows: Кодирует операнд в соответствии с кодовой страницей ANSI (CP_ACP) |
palmos | Кодировка PalmOS 3.5 | |
punycode | Реализует RFC 3492 | |
raw_unicode_escape | Создаёт строку, подходящую в качестве необработанной Unicode-литералы в исходном коде Python | |
rot_13 | rot13 | Возвращает шифрование по методу Цезаря операнда |
undefined | Вызывает исключение для всех преобразований. Может использоваться в качестве кодировки системы, если не требуется автоматическое преобразование между байтовыми и строками Unicode. | |
unicode_escape | Создаёт строку, подходящую в качестве Unicode-литералы в исходном коде Python | |
unicode_internal | Возвращает внутреннее представление операнда |
Новое в версии 2.3: Кодировки idna и punycode.
Следующие кодеки предоставляют кодирование и декодирование str-в-str 2.
Кодек | Псевдонимы | Назначение | Кодировщик/декодер |
|---|---|---|---|
base64_codec | base64, base-64 | Преобразует операнд в многострочный MIME base64 (результат всегда включает заключительный | |
bz2_codec | bz2 | Сжимает операнд с помощью bz2 | |
hex_codec | hex | Преобразует операнд в шестнадцатеричное представление с двумя цифрами на байт | |
quopri_codec | quopri, quoted-printable, quotedprintable | Преобразует операнд в MIME quoted printable |
|
string_escape | Создаёт строку, подходящую в качестве строковой литералы в исходном коде Python | ||
uu_codec | uu | Преобразует операнд с помощью uuencode | |
zlib_codec | zip, zlib | Сжимает операнд с помощью gzip |
-
1 -
Объекты str также принимаются в качестве входных данных вместо объектов unicode. Они неявно преобразуются в unicode путём декодирования с использованием кодировки по умолчанию. Если это преобразование завершается неудачей, это может привести к тому, что операции кодирования будут вызывать
UnicodeDecodeError. -
2(1,2) -
Объекты unicode также принимаются в качестве входных данных вместо объектов str. Они неявно преобразуются в str путём кодирования с использованием кодировки по умолчанию. Если это преобразование завершается неудачей, это может привести к тому, что операции декодирования будут вызывать
UnicodeEncodeError.
5. encodings.idna — Международные доменные имена в приложениях
Новое в версии 2.3.
Этот модуль реализует RFC 3490 (Международные доменные имена в приложениях) и RFC 3492 (Nameprep: Профиль Stringprep для международных доменных имён (IDN)). Он основан на кодировке punycode и stringprep.
Эти RFC вместе определяют протокол для поддержки не-ASCII символов в доменных именах. Доменное имя, содержащее не-ASCII символы (например, www.Alliancefrançaise.nu) преобразуется в ASCII-совместимую кодировку (ACE, например, www.xn--alliancefranaise-npb.nu). Форма ACE доменного имени затем используется во всех местах, где произвольные символы не допускаются протоколом, таких как запросы DNS, поля HTTP Host и так далее. Это преобразование выполняется в приложении; по возможности незаметно для пользователя: Приложение должно прозрачно преобразовывать метки доменных имён Unicode в IDNA в сети и преобразовывать метки ACE обратно в Unicode, прежде чем представлять их пользователю.
Python поддерживает это преобразование несколькими способами: кодек idna выполняет преобразование между Unicode и ACE, разбивая входную строку на метки на основе символов-разделителей, определённых в разделе 3.1 (1) RFC 3490 и преобразуя каждую метку в ACE по мере необходимости, и наоборот, разбивая входную строку байтов на метки на основе . разделителя и преобразуя любые найденные метки ACE в unicode. Кроме того, модуль socket прозрачно преобразует имена хостов Unicode в ACE, так что приложениям не нужно беспокоиться о преобразовании имён хостов самих по себе, когда они передают их модулю socket. Приложения, имеющие имена хостов в качестве параметров функций, такие как httplib и ftplib, принимают имена хостов Unicode (httplib тогда также прозрачно отправляет имя хоста IDNA в поле Host, если оно отправляет это поле вообще).
При получении имён хостов из сети (например, при обратном поиске имён) автоматического преобразования в Unicode не производится: Приложения, желающие представить такие имена хостов пользователю, должны декодировать их в Unicode.
Модуль encodings.idna также реализует процедуру nameprep, которая выполняет определённые нормализации для имён хостов, чтобы достичь регистронезависимости международных доменных имён и унифицировать похожие символы. Функции nameprep можно использовать непосредственно, если это необходимо.
-
encodings.idna.nameprep(label) -
Возвращает преобразованную версию метки label. Реализация в настоящее время предполагает строки запросов, поэтому
AllowUnassignedравно true.
-
encodings.idna.ToASCII(label) -
Преобразует метку в ASCII, как указано в RFC 3490.
UseSTD3ASCIIRulesпредполагается false.
-
encodings.idna.ToUnicode(label) -
Преобразует метку в Unicode, как указано в RFC 3490.
6. encodings.utf_8_sig — UTF-8 кодек с подписью BOM
Новое в версии 2.5.
Этот модуль реализует вариант кодека UTF-8: при кодировании к закодированным байтам UTF-8 будет добавлен BOM. Для состоятельного кодировщика это делается только один раз (при первом записи в байтовый поток). При декодировании необязательный BOM, закодированный в UTF-8, в начале данных будет пропущен.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/2.7/library/codecs.html