Объекты Unicode и кодеки
Объекты Unicode
С момента реализации PEP 393 в Python 3.3, объекты Unicode используют различные внутренние представления, чтобы обрабатывать весь диапазон символов Unicode, оставаясь при этом эффективными в плане памяти. Существуют специальные случаи для строк, где все коды символов находятся ниже 128, 256 или 65536; в противном случае, коды символов должны быть ниже 1114112 (что соответствует полному диапазону Unicode).
Py_UNICODE* и представления UTF-8 создаются по запросу и кешируются в объекте Unicode. Представление Py_UNICODE* устарело и неэффективно.
Из-за перехода между старыми и новыми API, объекты Unicode могут находиться во внутреннем состоянии, зависящем от способа их создания:
- «Канонические» объекты Unicode — это все объекты, созданные с помощью не устаревшего API Unicode. Они используют наиболее эффективное представление, допускаемое реализацией.
- «Устаревшие» объекты Unicode были созданы с помощью устаревших API (обычно
PyUnicode_FromUnicode()) и содержат только представлениеPy_UNICODE*; вам необходимо вызватьPyUnicode_READY()для них перед вызовом любого другого API.
Примечание
«Устаревшие» объекты Unicode будут удалены в Python 3.12 вместе с устаревшими API. Все объекты Unicode с этого момента будут «каноническими». Более подробную информацию см. в PEP 623.
Тип Юникода
Это основные типы объектов Юникода, используемые для реализации Юникода в Python:
-
Py_UCS4 -
Py_UCS2 -
Py_UCS1 -
Эти типы являются псевдонимами для целочисленных типов без знака, достаточно широких для хранения символов 32, 16 и 8 бит соответственно. При работе с отдельными символами Юникода используйте
Py_UCS4.Добавлена в версии 3.3.
-
Py_UNICODE -
Это псевдоним типа
wchar_t, который является 16-битным типом или 32-битным типом в зависимости от платформы.Изменено в версии 3.3: В предыдущих версиях это был 16-битный тип или 32-битный тип в зависимости от того, выбрали ли вы «узкую» или «широкую» версию Юникода Python во время сборки.
-
PyASCIIObject -
PyCompactUnicodeObject -
PyUnicodeObject -
Эти подтипы
PyObjectпредставляют собой объект Python Юникода. Почти во всех случаях их не следует использовать напрямую, так как все функции API, которые работают с объектами Юникода, принимают и возвращают указателиPyObject.Добавлена в версии 3.3.
-
PyTypeObject PyUnicode_Type -
Этот экземпляр
PyTypeObjectпредставляет тип Python Юникода. Он предоставляется коду Python какstr.
Следующие API на самом деле являются макросами C и могут использоваться для быстрой проверки и доступа к внутренним неизменяемым данным объектов Юникода:
-
int PyUnicode_Check(PyObject *o) -
Возвращает true, если объект o является объектом Юникода или экземпляром подтипа Юникода.
-
int PyUnicode_CheckExact(PyObject *o) -
Возвращает true, если объект o является объектом Юникода, но не экземпляром подтипа.
-
int PyUnicode_READY(PyObject *o) -
Обеспечивает, что строковый объект o находится в «каноническом» представлении. Это необходимо перед использованием каких-либо макросов доступа, описанных ниже.
Возвращает
0при успехе и-1с установленным исключением при неудаче, что, в частности, происходит при неудачном выделении памяти.Добавлена в версии 3.3.
Устарело начиная с версии 3.10, будет удалено в версии 3.12: Этот API будет удалён с
PyUnicode_FromUnicode().
-
Py_ssize_t PyUnicode_GET_LENGTH(PyObject *o) -
Возвращает длину строки Юникода в кодовых точках. o должен быть объектом Юникода в «каноническом» представлении (не проверяется).
Добавлена в версии 3.3.
-
Py_UCS1* PyUnicode_1BYTE_DATA(PyObject *o) -
Py_UCS2* PyUnicode_2BYTE_DATA(PyObject *o) -
Py_UCS4* PyUnicode_4BYTE_DATA(PyObject *o) -
Возвращает указатель на каноническое представление, преобразованный к целочисленным типам UCS1, UCS2 или UCS4 для прямого доступа к символам. Не выполняются проверки, если каноническое представление имеет правильный размер символа; используйте
PyUnicode_KIND()для выбора нужного макроса. Убедитесь, чтоPyUnicode_READY()был вызван перед доступом к этому.Добавлена в версии 3.3.
-
PyUnicode_WCHAR_KIND -
PyUnicode_1BYTE_KIND -
PyUnicode_2BYTE_KIND -
PyUnicode_4BYTE_KIND -
Возвращаемые значения макроса
PyUnicode_KIND().Добавлена в версии 3.3.
Устарело начиная с версии 3.10, будет удалено в версии 3.12:
PyUnicode_WCHAR_KINDустарело.
-
int PyUnicode_KIND(PyObject *o) -
Возвращает одну из констант типа Юникода (см. выше), указывающих, сколько байтов на символ использует этот объект Юникода для хранения своих данных. o должен быть объектом Юникода в «каноническом» представлении (не проверяется).
Добавлена в версии 3.3.
-
void* PyUnicode_DATA(PyObject *o) -
Возвращает указатель на сырой буфер Юникода. o должен быть объектом Юникода в «каноническом» представлении (не проверяется).
Добавлена в версии 3.3.
-
void PyUnicode_WRITE(int kind, void *data, Py_ssize_t index, Py_UCS4 value) -
Записывает в каноническое представление data (полученное с помощью
PyUnicode_DATA()). Этот макрос не выполняет никаких проверок и предназначен для использования в циклах. Вызывающий должен кэшировать значение kind и указатель data, полученные из других вызовов макросов. index — это индекс в строке (начинается с 0), а value — новое значение кодовой точки, которое должно быть записано в это место.Добавлена в версии 3.3.
-
Py_UCS4 PyUnicode_READ(int kind, void *data, Py_ssize_t index) -
Считывает кодовую точку из канонического представления data (полученного с помощью
PyUnicode_DATA()). Не выполняются проверки или вызовы готовности.Добавлена в версии 3.3.
-
Py_UCS4 PyUnicode_READ_CHAR(PyObject *o, Py_ssize_t index) -
Считывает символ из объекта Юникода o, который должен быть в «каноническом» представлении. Это менее эффективно, чем
PyUnicode_READ(), если вы выполняете несколько последовательных чтений.Добавлена в версии 3.3.
-
PyUnicode_MAX_CHAR_VALUE(o) -
Возвращает максимальную кодовую точку, подходящую для создания другой строки на основе o, который должен быть в «каноническом» представлении. Это всегда приближение, но более эффективно, чем итерация по строке.
Добавлена в версии 3.3.
-
int PyUnicode_ClearFreeList() -
Очищает список освобождения. Возвращает общее количество освобождённых элементов.
-
Py_ssize_t PyUnicode_GET_SIZE(PyObject *o) -
Возвращает размер устаревшего представления
Py_UNICODEв единицах кода (включает пары суррогатов как 2 единицы). o должен быть объектом Юникода (не проверяется).Устарело начиная с версии 3.3, будет удалено в версии 3.12: Часть API Юникода старого стиля, пожалуйста, перейдите к использованию
PyUnicode_GET_LENGTH().
-
Py_ssize_t PyUnicode_GET_DATA_SIZE(PyObject *o) -
Возвращает размер устаревшего представления
Py_UNICODEв байтах. o должен быть объектом Юникода (не проверяется).Устарело начиная с версии 3.3, будет удалено в версии 3.12: Часть API Юникода старого стиля, пожалуйста, перейдите к использованию
PyUnicode_GET_LENGTH().
-
Py_UNICODE* PyUnicode_AS_UNICODE(PyObject *o) -
const char* PyUnicode_AS_DATA(PyObject *o) -
Возвращает указатель на представление
Py_UNICODEобъекта. Возвращаемый буфер всегда завершается дополнительной нулевой кодовой точкой. Он также может содержать вложенные нулевые кодовые точки, что приведёт к усечению строки при использовании в большинстве функций C. ФормаAS_DATAпреобразует указатель вconst char *. Аргумент o должен быть объектом Юникода (не проверяется).Изменено в версии 3.3: Этот макрос теперь неэффективен — потому что во многих случаях представление
Py_UNICODEне существует и нужно его создать — и может завершиться ошибкой (возвращаетNULLс установленным исключением). Постарайтесь перенести код на использование новых макросовPyUnicode_nBYTE_DATA()или используйтеPyUnicode_WRITE()илиPyUnicode_READ().Устарело начиная с версии 3.3, будет удалено в версии 3.12: Часть API Юникода старого стиля, пожалуйста, перейдите к использованию семейства макросов
PyUnicode_nBYTE_DATA().
Свойства символов Юникода
Юникод предоставляет множество различных свойств символов. Наиболее часто используемые из них доступны через эти макросы, которые отображаются на C-функции в зависимости от конфигурации Python.
-
int Py_UNICODE_ISSPACE(Py_UNICODE ch) -
Возвращает
1или0в зависимости от того, является ли ch символом пробела.
-
int Py_UNICODE_ISLOWER(Py_UNICODE ch) -
Возвращает
1или0в зависимости от того, является ли ch символом строчной буквы.
-
int Py_UNICODE_ISUPPER(Py_UNICODE ch) -
Возвращает
1или0в зависимости от того, является ли ch символом заглавной буквы.
-
int Py_UNICODE_ISTITLE(Py_UNICODE ch) -
Возвращает
1или0в зависимости от того, является ли ch символом буквы в стиле заголовка.
-
int Py_UNICODE_ISLINEBREAK(Py_UNICODE ch) -
Возвращает
1или0в зависимости от того, является ли ch символом разрыва строки.
-
int Py_UNICODE_ISDECIMAL(Py_UNICODE ch) -
Возвращает
1или0в зависимости от того, является ли ch десятичным символом.
-
int Py_UNICODE_ISDIGIT(Py_UNICODE ch) -
Возвращает
1или0в зависимости от того, является ли ch символом цифры.
-
int Py_UNICODE_ISNUMERIC(Py_UNICODE ch) -
Возвращает
1или0в зависимости от того, является ли ch числовым символом.
-
int Py_UNICODE_ISALPHA(Py_UNICODE ch) -
Возвращает
1или0в зависимости от того, является ли ch буквенным символом.
-
int Py_UNICODE_ISALNUM(Py_UNICODE ch) -
Возвращает
1или0в зависимости от того, является ли ch буквенно-цифровым символом.
-
int Py_UNICODE_ISPRINTABLE(Py_UNICODE ch) -
Возвращает
1или0в зависимости от того, является ли ch печатаемым символом. Непечатаемые символы — это символы, определенные в базе данных символов Юникода как «Другие» или «Разделитель», за исключением ASCII-пробела (0x20), который считается печатаемым. (Обратите внимание, что печатаемые символы в этом контексте — это те символы, которые не должны экранироваться при вызовеrepr()для строки. Это не имеет отношения к обработке строк, выводимых вsys.stdoutилиsys.stderr.)
Эти API могут использоваться для быстрой прямой конвертации символов:
-
Py_UNICODE Py_UNICODE_TOLOWER(Py_UNICODE ch) -
Возвращает символ ch, преобразованный в нижний регистр.
Устарело начиная с версии 3.3: Эта функция использует простые соответствия регистров.
-
Py_UNICODE Py_UNICODE_TOUPPER(Py_UNICODE ch) -
Возвращает символ ch, преобразованный в верхний регистр.
Устарело начиная с версии 3.3: Эта функция использует простые соответствия регистров.
-
Py_UNICODE Py_UNICODE_TOTITLE(Py_UNICODE ch) -
Возвращает символ ch, преобразованный в регистр заголовка.
Устарело начиная с версии 3.3: Эта функция использует простые соответствия регистров.
-
int Py_UNICODE_TODECIMAL(Py_UNICODE ch) -
Возвращает символ ch, преобразованный в положительное целое десятичное число. Возвращает
-1если это невозможно. Этот макрос не генерирует исключений.
-
int Py_UNICODE_TODIGIT(Py_UNICODE ch) -
Возвращает символ ch, преобразованный в целое число, представляющее цифру. Возвращает
-1если это невозможно. Этот макрос не генерирует исключений.
-
double Py_UNICODE_TONUMERIC(Py_UNICODE ch) -
Возвращает символ ch, преобразованный в число с плавающей точкой. Возвращает
-1.0если это невозможно. Этот макрос не генерирует исключений.
Эти API могут использоваться для работы с суррогатами:
-
Py_UNICODE_IS_SURROGATE(ch) -
Проверяет, является ли ch суррогатом (
0xD800 <= ch <= 0xDFFF).
-
Py_UNICODE_IS_HIGH_SURROGATE(ch) -
Проверяет, является ли ch высоким суррогатом (
0xD800 <= ch <= 0xDBFF).
-
Py_UNICODE_IS_LOW_SURROGATE(ch) -
Проверяет, является ли ch низким суррогатом (
0xDC00 <= ch <= 0xDFFF).
-
Py_UNICODE_JOIN_SURROGATES(high, low) -
Объединяет два суррогатных символа и возвращает единственное значение Py_UCS4. high и low — соответственно, ведущий и последующий суррогаты в паре суррогатов.
Создание и доступ к строкам Unicode
Для создания объектов Unicode и доступа к их основным свойствам последовательностей используйте эти API:
-
PyObject* PyUnicode_New(Py_ssize_t size, Py_UCS4 maxchar) -
Значение возврата: Новая ссылка.
Создает новый объект Unicode. maxchar должен быть истинным максимальным кодовым значением, которое должно быть размещено в строке. В качестве приближения его можно округлить до ближайшего значения в последовательности 127, 255, 65535, 1114111.
Это рекомендуемый способ выделения нового объекта Unicode. Объекты, созданные с помощью этой функции, не изменяют размер.
Новое в версии 3.3.
-
PyObject* PyUnicode_FromKindAndData(int kind, const void *buffer, Py_ssize_t size) -
Значение возврата: Новая ссылка.
Создает новый объект Unicode с заданным kind (возможные значения —
PyUnicode_1BYTE_KINDи т. д., возвращаемыеPyUnicode_KIND()). buffer должен указывать на массив из size единиц по 1, 2 или 4 байта на символ, как задано kind.Новое в версии 3.3.
-
PyObject* PyUnicode_FromStringAndSize(const char *u, Py_ssize_t size) -
Значение возврата: Новая ссылка.
Создает объект Unicode из буфера символов u. Байты будут интерпретированы как закодированные в UTF-8. Буфер копируется в новый объект. Если буфер не
NULL, значение возврата может быть общим объектом, т. е. изменение данных запрещено.Если u
NULL, эта функция ведет себя какPyUnicode_FromUnicode()с буфером, установленным вNULL. Это использование устарело и будет удалено в Python 3.12, в пользуPyUnicode_New().
-
PyObject *PyUnicode_FromString(const char *u) -
Значение возврата: Новая ссылка.
Создает объект Unicode из нуль-терминированного буфера символов u, закодированного в UTF-8.
-
PyObject* PyUnicode_FromFormat(const char *format, ...) -
Значение возврата: Новая ссылка.
Принимает строку формата C
printf()и переменное число аргументов, вычисляет размер получившейся Python-строки Unicode и возвращает строку с отформатированными в нее значениями. Переменные аргументы должны быть типами C и точно соответствовать символам формата в ASCII-строке format. Разрешены следующие символы формата:Символы формата
Тип
Примечание
%%n/a
Буквальное значение %.
%cint
Один символ, представленный целым числом C.
%dint
Эквивалентно
printf("%d"). 1%uunsigned int
Эквивалентно
printf("%u"). 1%ldlong
Эквивалентно
printf("%ld"). 1%lilong
Эквивалентно
printf("%li"). 1%luunsigned long
Эквивалентно
printf("%lu"). 1%lldlong long
Эквивалентно
printf("%lld"). 1%llilong long
Эквивалентно
printf("%lli"). 1%lluunsigned long long
Эквивалентно
printf("%llu"). 1%zdPy_ssize_t
Эквивалентно
printf("%zd"). 1%ziPy_ssize_t
Эквивалентно
printf("%zi"). 1%zusize_t
Эквивалентно
printf("%zu"). 1%iint
Эквивалентно
printf("%i"). 1%xint
Эквивалентно
printf("%x"). 1%sconst char*
Нуль-терминированный массив символов C.
%pconst void*
Шестнадцатеричное представление указателя C. В основном эквивалентно
printf("%p")за исключением того, что он гарантированно начинается с0xнезависимо от того, что возвращает платформаprintf.%APyObject*
Результат вызова
ascii().%UPyObject*
Объект Unicode.
%VPyObject*, const char*
Объект Unicode (который может быть
NULL) и нуль-терминированный массив символов C в качестве второго параметра (который будет использован, если первый параметрNULL).%SPyObject*
Результат вызова
PyObject_Str().%RPyObject*
Результат вызова
PyObject_Repr().Нераспознанный символ формата приводит к тому, что все остальные символы строки формата копируются как есть в результирующую строку, и все дополнительные аргументы отбрасываются.
Примечание
Единица ширины форматера — это количество символов, а не байтов. Единица точности форматера — это количество байтов для
"%s"и"%V"(если аргументPyObject*NULL), и количество символов для"%A","%U","%S","%R"и"%V"(если аргументPyObject*неNULL).-
1(1,2,3,4,5,6,7,8,9,10,11,12,13) -
Для спецификаторов целых чисел (d, u, ld, li, lu, lld, lli, llu, zd, zi, zu, i, x): флаг 0-преобразования действует даже при указании точности.
Изменено в версии 3.2: Добавлена поддержка
"%lld"и"%llu".Изменено в версии 3.3: Добавлена поддержка
"%li","%lli"и"%zi".Изменено в версии 3.4: Добавлена поддержка ширины и точности форматера для
"%s","%A","%U","%V","%S","%R". -
-
PyObject* PyUnicode_FromFormatV(const char *format, va_list vargs) -
Значение возврата: Новая ссылка.
Идентично
PyUnicode_FromFormat(), за исключением того, что она принимает ровно два аргумента.
-
PyObject* PyUnicode_FromEncodedObject(PyObject *obj, const char *encoding, const char *errors) -
Значение возврата: Новая ссылка.
Декодирует закодированный объект obj в объект Unicode.
bytes,bytearrayи другие объекты-последовательности байтов декодируются в соответствии с заданным encoding и обработкой ошибок, определенной в errors. Оба могут бытьNULL, чтобы интерфейс использовал значения по умолчанию (см. Встроенные кодеки для получения подробностей).Все остальные объекты, включая объекты Unicode, вызывают установку
TypeError.API возвращает
NULLв случае ошибки. Вызывающая сторона отвечает за decref возвращаемых объектов.
-
Py_ssize_t PyUnicode_GetLength(PyObject *unicode) -
Возвращает длину объекта Unicode в кодовых точках.
Новое в версии 3.3.
-
Py_ssize_t PyUnicode_CopyCharacters(PyObject *to, Py_ssize_t to_start, PyObject *from, Py_ssize_t from_start, Py_ssize_t how_many) -
Копирование символов из одного объекта Unicode в другой. Эта функция выполняет преобразование символов при необходимости и переходит к
memcpy()если возможно. Возвращает-1и устанавливает исключение при ошибке, в противном случае возвращает количество скопированных символов.Добавлена в версии 3.3.
-
Py_ssize_t PyUnicode_Fill(PyObject *unicode, Py_ssize_t start, Py_ssize_t length, Py_UCS4 fill_char) -
Заполнение строки символом: запись fill_char в
unicode[start:start+length].Возвращает ошибку, если fill_char больше максимального символа строки или если у строки более 1 ссылки.
Возвращает количество записанных символов или
-1и вызывает исключение при ошибке.Добавлена в версии 3.3.
-
int PyUnicode_WriteChar(PyObject *unicode, Py_ssize_t index, Py_UCS4 character) -
Запись символа в строку. Строка должна быть создана с помощью
PyUnicode_New(). Поскольку строки Unicode предполагаются неизменяемыми, строка не должна быть совместно используемой или уже хешированной.Эта функция проверяет, что unicode является объектом Unicode, что индекс не выходит за пределы, и что объект может быть изменён безопасно (то есть, что его счётчик ссылок равен одному).
Добавлена в версии 3.3.
-
Py_UCS4 PyUnicode_ReadChar(PyObject *unicode, Py_ssize_t index) -
Чтение символа из строки. Эта функция проверяет, что unicode является объектом Unicode и что индекс не выходит за пределы, в отличие от макроса
PyUnicode_READ_CHAR().Добавлена в версии 3.3.
-
PyObject* PyUnicode_Substring(PyObject *str, Py_ssize_t start, Py_ssize_t end) -
Значение возврата: Новая ссылка.
Возвращает подстроку str, начиная с символа с индексом start (включительно) и до символа с индексом end (исключительно). Отрицательные индексы не поддерживаются.
Добавлена в версии 3.3.
-
Py_UCS4* PyUnicode_AsUCS4(PyObject *u, Py_UCS4 *buffer, Py_ssize_t buflen, int copy_null) -
Копирует строку u в буфер UCS4, включая нулевой символ, если copy_null установлен. Возвращает
NULLи устанавливает исключение при ошибке (в частности,SystemError, если buflen меньше длины u). buffer возвращается при успехе.Добавлена в версии 3.3.
-
Py_UCS4* PyUnicode_AsUCS4Copy(PyObject *u) -
Копирует строку u в новый буфер UCS4, который выделяется с помощью
PyMem_Malloc(). Если это не удаётся, возвращаетсяNULLс установленнымMemoryError. Возвращаемый буфер всегда имеет дополнительный нулевой код символа.Добавлена в версии 3.3.
Устаревшие Py_UNICODE API
Устарело начиная с версии 3.3, будет удалено в версии 3.12.
Эти функции API устарели с внедрением PEP 393. Модули расширения могут продолжать их использовать, так как они не будут удалены в Python 3.x, но должны учитывать, что их использование может теперь приводить к снижению производительности и увеличению потребления памяти.
-
PyObject* PyUnicode_FromUnicode(const Py_UNICODE *u, Py_ssize_t size) -
Возвращаемое значение: Новый ссылка.
Создает объект Unicode из буфера Py_UNICODE u заданного размера. u может быть
NULL, что приводит к неопределенному содержанию. Пользователь несет ответственность за заполнение необходимых данных. Буфер копируется в новый объект.Если буфер не
NULL, возвращаемое значение может быть общим объектом. Поэтому изменение полученного объекта Unicode разрешено только тогда, когда uNULL.Если буфер
NULL, необходимо вызватьPyUnicode_READY(), как только содержимое строки будет заполнено, прежде чем использовать любые макросы доступа, такие какPyUnicode_KIND().Устарело начиная с версии 3.3, будет удалено в версии 3.12: Часть API старой стилистики Unicode, пожалуйста, мигрируйте на использование
PyUnicode_FromKindAndData(),PyUnicode_FromWideChar()илиPyUnicode_New().
-
Py_UNICODE* PyUnicode_AsUnicode(PyObject *unicode) -
Возвращает неизменяемую ссылку на внутренний буфер
Py_UNICODEобъекта Unicode илиNULLпри ошибке. Это создаст представлениеPy_UNICODE*объекта, если оно еще не доступно. Буфер всегда завершается дополнительным нулевым кодом. Обратите внимание, что полученная строкаPy_UNICODEтакже может содержать вложенные нулевые коды, что приведет к усечению строки при использовании в большинстве функций C.Устарело начиная с версии 3.3, будет удалено в версии 3.12: Часть API старой стилистики Unicode, пожалуйста, мигрируйте на использование
PyUnicode_AsUCS4(),PyUnicode_AsWideChar(),PyUnicode_ReadChar()или аналогичных новых API.Устарело начиная с версии 3.3, будет удалено в версии 3.10.
-
PyObject* PyUnicode_TransformDecimalToASCII(Py_UNICODE *s, Py_ssize_t size) -
Возвращаемое значение: Новый ссылка.
Создает объект Unicode, заменяя все десятичные цифры в буфере
Py_UNICODEзаданного размера на ASCII цифры 0–9 в соответствии с их десятичным значением. ВозвращаетNULLпри возникновении исключения.Устарело начиная с версии 3.3, будет удалено в версии 3.11: Часть API старой стилистики
Py_UNICODE; пожалуйста, мигрируйте на использованиеPy_UNICODE_TODECIMAL().
-
Py_UNICODE* PyUnicode_AsUnicodeAndSize(PyObject *unicode, Py_ssize_t *size) -
Аналогично
PyUnicode_AsUnicode(), но также сохраняет длину массиваPy_UNICODE()(исключая дополнительный нулевой терминатор) в size. Обратите внимание, что полученная строкаPy_UNICODE*может содержать вложенные нулевые коды, что приведет к усечению строки при использовании в большинстве функций C.Введено в версии 3.3.
Устарело начиная с версии 3.3, будет удалено в версии 3.12: Часть API старой стилистики Unicode, пожалуйста, мигрируйте на использование
PyUnicode_AsUCS4(),PyUnicode_AsWideChar(),PyUnicode_ReadChar()или аналогичных новых API.
-
Py_UNICODE* PyUnicode_AsUnicodeCopy(PyObject *unicode) -
Создает копию строки Unicode, завершающейся нулевым кодом. Возвращает
NULLи вызывает исключениеMemoryErrorпри сбое выделения памяти, в противном случае возвращает новый выделенный буфер (используйтеPyMem_Free()для освобождения буфера). Обратите внимание, что полученная строкаPy_UNICODE*может содержать вложенные нулевые коды, что приведет к усечению строки при использовании в большинстве функций C.Введено в версии 3.2.
Пожалуйста, мигрируйте на использование
PyUnicode_AsUCS4Copy()или аналогичных новых API.
-
Py_ssize_t PyUnicode_GetSize(PyObject *unicode) -
Возвращает размер устаревшего представления
Py_UNICODEв единицах кода (это включает суррогатные пары как 2 единицы).Устарело начиная с версии 3.3, будет удалено в версии 3.12: Часть API старой стилистики Unicode, пожалуйста, мигрируйте на использование
PyUnicode_GET_LENGTH().
-
PyObject* PyUnicode_FromObject(PyObject *obj) -
Возвращаемое значение: Новый ссылка.
Копирует экземпляр подтипа Unicode в новый истинный объект Unicode, если необходимо. Если obj уже является истинным объектом Unicode (а не подтипом), возвращает ссылку с увеличенным счетчиком ссылок.
Объекты, отличные от Unicode или его подтипов, вызовут
TypeError.
Кодировка локали
Текущую кодировку локали можно использовать для декодирования текста из операционной системы.
-
PyObject* PyUnicode_DecodeLocaleAndSize(const char *str, Py_ssize_t len, const char *errors) -
Значение возврата: новая ссылка.
Декодировать строку из UTF-8 на Android и VxWorks или из текущей кодировки локали на других платформах. Поддерживаемые обработчики ошибок —
"strict"и"surrogateescape"(PEP 383). Декодер использует обработчик ошибок"strict"если errors имеет значениеNULL. str должна заканчиваться нулевым символом, но не может содержать вложенные нулевые символы.Используйте
PyUnicode_DecodeFSDefaultAndSize()для декодирования строки изPy_FileSystemDefaultEncoding(кодировка локали, считанная при запуске Python).Эта функция игнорирует режим Python UTF-8.
См. также
Функцию
Py_DecodeLocale().Новая в версии 3.3.
Изменено в версии 3.7: Функция теперь также использует текущую кодировку локали для обработчика ошибок
surrogateescape, за исключением Android. Ранее дляsurrogateescapeиспользоваласьPy_DecodeLocale(), а дляstrictиспользовалась текущая кодировка локали.
-
PyObject* PyUnicode_DecodeLocale(const char *str, const char *errors) -
Значение возврата: новая ссылка.
Аналогично
PyUnicode_DecodeLocaleAndSize(), но вычисляет длину строки с помощьюstrlen().Новая в версии 3.3.
-
PyObject* PyUnicode_EncodeLocale(PyObject *unicode, const char *errors) -
Значение возврата: новая ссылка.
Кодировать объект Unicode в UTF-8 на Android и VxWorks или в текущую кодировку локали на других платформах. Поддерживаемые обработчики ошибок —
"strict"и"surrogateescape"(PEP 383). Кодировщик использует обработчик ошибок"strict"если errors имеет значениеNULL. Возвращает объектbytes. unicode не может содержать вложенных нулевых символов.Используйте
PyUnicode_EncodeFSDefault()для кодирования строки вPy_FileSystemDefaultEncoding(кодировка локали, считанная при запуске Python).Эта функция игнорирует режим Python UTF-8.
См. также
Функцию
Py_EncodeLocale().Новая в версии 3.3.
Изменено в версии 3.7: Функция теперь также использует текущую кодировку локали для обработчика ошибок
surrogateescape, за исключением Android. Ранее дляsurrogateescapeиспользоваласьPy_EncodeLocale(), а дляstrictиспользовалась текущая кодировка локали.
Кодировка файловой системы
Для кодирования и декодирования имён файлов и других строк среды необходимо использовать Py_FileSystemDefaultEncoding в качестве кодировки и Py_FileSystemDefaultEncodeErrors в качестве обработчика ошибок (PEP 383 и PEP 529). Для кодирования имён файлов в bytes во время анализа аргументов необходимо использовать преобразователь "O&", передав PyUnicode_FSConverter() в качестве функции преобразования:
-
int PyUnicode_FSConverter(PyObject* obj, void* result) -
Преобразователь ParseTuple: кодировать объекты
str— полученные напрямую или через интерфейсos.PathLike— вbytesс использованиемPyUnicode_EncodeFSDefault(); объектыbytesвыводятся как есть. result должен быть объектомPyBytesObject*, который должен быть освобождён, когда он больше не используется.Новая в версии 3.1.
Изменено в версии 3.6: Принимает объект-путь.
Для декодирования имён файлов в str во время анализа аргументов необходимо использовать преобразователь "O&", передав PyUnicode_FSDecoder() в качестве функции преобразования:
-
int PyUnicode_FSDecoder(PyObject* obj, void* result) -
Преобразователь ParseTuple: декодировать объекты
bytes— полученные напрямую или косвенно через интерфейсos.PathLike— вstrс использованиемPyUnicode_DecodeFSDefaultAndSize(); объектыstrвыводятся как есть. result должен быть объектомPyUnicodeObject*, который должен быть освобождён, когда он больше не используется.Новая в версии 3.2.
Изменено в версии 3.6: Принимает объект-путь.
-
PyObject* PyUnicode_DecodeFSDefaultAndSize(const char *s, Py_ssize_t size) -
Значение возврата: новая ссылка.
Декодировать строку с помощью
Py_FileSystemDefaultEncodingи обработчика ошибокPy_FileSystemDefaultEncodeErrors.Если
Py_FileSystemDefaultEncodingне задано, используется кодировка локали по умолчанию.Py_FileSystemDefaultEncodingинициализируется при запуске из кодировки локали и не может быть изменён позже. Если вам необходимо декодировать строку из текущей кодировки локали, используйтеPyUnicode_DecodeLocaleAndSize().См. также
Функцию
Py_DecodeLocale().Изменено в версии 3.6: Используется обработчик ошибок
Py_FileSystemDefaultEncodeErrors.
-
PyObject* PyUnicode_DecodeFSDefault(const char *s) -
Значение возврата: новая ссылка.
Декодировать строку с нулевым завершением с помощью
Py_FileSystemDefaultEncodingи обработчика ошибокPy_FileSystemDefaultEncodeErrors.Если
Py_FileSystemDefaultEncodingне задано, используется кодировка локали по умолчанию.Используйте
PyUnicode_DecodeFSDefaultAndSize(), если известна длина строки.Изменено в версии 3.6: Используется обработчик ошибок
Py_FileSystemDefaultEncodeErrors.
-
PyObject* PyUnicode_EncodeFSDefault(PyObject *unicode) -
Значение возврата: новая ссылка.
Кодировать объект Unicode в
Py_FileSystemDefaultEncodingс обработчиком ошибокPy_FileSystemDefaultEncodeErrorsи возвратитьbytes. Обратите внимание, что полученный объектbytesможет содержать нулевые байты.Если
Py_FileSystemDefaultEncodingне задано, используется кодировка локали по умолчанию.Py_FileSystemDefaultEncodingинициализируется при запуске из кодировки локали и не может быть изменён позже. Если вам необходимо закодировать строку в текущую кодировку локали, используйтеPyUnicode_EncodeLocale().См. также
Функцию
Py_EncodeLocale().Новая в версии 3.2.
Изменено в версии 3.6: Используется обработчик ошибок
Py_FileSystemDefaultEncodeErrors.
Поддержка wchar_t
wchar_t поддержка для платформ, которые её поддерживают:
-
PyObject* PyUnicode_FromWideChar(const wchar_t *w, Py_ssize_t size) -
Значение возврата: Новая ссылка.
Создаёт объект Unicode из буфера
wchar_tw заданного размера. Передача-1в качестве размера указывает, что функция должна сама вычислить длину, используя wcslen. ВозвращаетNULLв случае ошибки.
-
Py_ssize_t PyUnicode_AsWideChar(PyObject *unicode, wchar_t *w, Py_ssize_t size) -
Копирует содержимое объекта Unicode в буфер
wchar_tw. Копируются не более sizewchar_tсимволов (исключая возможный заключительный нулевой символ). Возвращает количество скопированныхwchar_tсимволов или-1в случае ошибки. Обратите внимание, что результирующая строкаwchar_t*может быть или не быть завершаемой нулём. Ответственность вызывающей стороны – убедиться, что строкаwchar_t*завершается нулём, если это требуется приложением. Также обратите внимание, что строкаwchar_t*может содержать нулевые символы, что приведёт к обрезанию строки при использовании с большинством функций C.
-
wchar_t* PyUnicode_AsWideCharString(PyObject *unicode, Py_ssize_t *size) -
Преобразует объект Unicode в строку широких символов. Результирующая строка всегда завершается нулевым символом. Если size не
NULL, запишите количество широких символов (исключая заключительный нулевой символ) в *size. Обратите внимание, что полученная строкаwchar_tможет содержать нулевые символы, что приведёт к обрезанию строки при использовании с большинством функций C. Если sizeNULLи строкаwchar_t*содержит нулевые символы, генерируется исключениеValueError.Возвращает буфер, выделенный
PyMem_Alloc()(используйтеPyMem_Free()для его освобождения) в случае успеха. В случае ошибки возвращаетNULL, и *size не определено. Генерирует исключениеMemoryErrorв случае неудачи выделения памяти.Добавлена в версии 3.2.
Изменено в версии 3.7: Генерирует исключение
ValueErrorесли sizeNULLи строкаwchar_t*содержит нулевые символы.
Встроенные кодеки
Python предоставляет набор встроенных кодеков, написанных на C для повышения скорости. Все эти кодеки напрямую доступны через следующие функции.
Многие из следующих API принимают два аргумента: encoding и errors, и они имеют те же семантику, что и у встроенного конструктора строки str().
Установка encoding в NULL приводит к использованию кодировки по умолчанию, которая является ASCII. Вызовы файловой системы должны использовать PyUnicode_FSConverter() для кодирования имён файлов. Это использует переменную Py_FileSystemDefaultEncoding внутри. Эту переменную следует рассматривать как только для чтения: на некоторых системах она будет указателем на статическую строку, на других — она может меняться во время выполнения (например, при вызове приложения setlocale).
Обработка ошибок задаётся параметром errors, который также может быть установлен в значение NULL, что означает использование обработки по умолчанию, определённой для кодека. По умолчанию для всех встроенных кодеков используется обработка ошибок "строгая" (ValueError поднимается).
Все кодеки используют аналогичный интерфейс. Отклонения от следующих общих интерфейсов документированы для простоты.
Общие кодеки
Вот общие API для кодеков:
-
PyObject* PyUnicode_Decode(const char *s, Py_ssize_t size, const char *encoding, const char *errors) -
Возвращаемое значение: Новая ссылка.
Создаёт объект Unicode, декодируя
sizeбайт закодированной строкиs.encodingиerrorsимеют то же значение, что и параметры с таким же именем в функцииstr(). Кодек для использования находится в регистре кодеков Python. ВозвращаетNULLесли кодек поднял исключение.
-
PyObject* PyUnicode_AsEncodedString(PyObject *unicode, const char *encoding, const char *errors) -
Возвращаемое значение: Новая ссылка.
Кодирует объект Unicode и возвращает результат в виде объекта Python bytes.
encodingиerrorsимеют то же значение, что и параметры с таким же именем в методе Unicodeencode(). Кодек для использования находится в регистре кодеков Python. ВозвращаетNULLесли кодек поднял исключение.
-
PyObject* PyUnicode_Encode(const Py_UNICODE *s, Py_ssize_t size, const char *encoding, const char *errors) -
Возвращаемое значение: Новая ссылка.
Кодирует буфер
Py_UNICODEsзаданного размераsizeи возвращает объект Python bytes.encodingиerrorsимеют то же значение, что и параметры с таким же именем в методе Unicodeencode(). Кодек для использования находится в регистре кодеков Python. ВозвращаетNULLесли кодек поднял исключение.Устарело начиная с версии 3.3, будет удалено в версии 3.11: Часть старого стиля API
Py_UNICODE; пожалуйста, перейдите к использованиюPyUnicode_AsEncodedString().
Кодеки UTF-8
Вот API кодеков UTF-8:
-
PyObject* PyUnicode_DecodeUTF8(const char *s, Py_ssize_t size, const char *errors) -
Возвращаемое значение: Новая ссылка.
Создаёт объект Unicode, декодируя
sizeбайт строкиs, закодированной в UTF-8. ВозвращаетNULLесли кодек поднял исключение.
-
PyObject* PyUnicode_DecodeUTF8Stateful(const char *s, Py_ssize_t size, const char *errors, Py_ssize_t *consumed) -
Возвращаемое значение: Новая ссылка.
Если
consumedравноNULL, ведет себя какPyUnicode_DecodeUTF8(). Еслиconsumedне равноNULL, не будут обрабатываться как ошибка последовательности байтов UTF-8, которые не являются полными. Эти байты не будут декодироваться, и количество декодированных байтов будет сохранено вconsumed.
-
PyObject* PyUnicode_AsUTF8String(PyObject *unicode) -
Возвращаемое значение: Новая ссылка.
Кодирует объект Unicode в UTF-8 и возвращает результат в виде объекта Python bytes. Обработка ошибок — "строгая". Возвращает
NULLесли кодек поднял исключение.
-
const char* PyUnicode_AsUTF8AndSize(PyObject *unicode, Py_ssize_t *size) -
Возвращает указатель на кодировку UTF-8 объекта Unicode и сохраняет размер закодированного представления (в байтах) в
size. Аргументsizeможет бытьNULL; в этом случае размер не будет сохранён. Возвращаемый буфер всегда имеет дополнительный нулевой байт в конце (не включён вsize), независимо от того, есть ли другие нулевые кодовые точки.В случае ошибки возвращается
NULLс установленным исключением иsizeне сохраняется.Кэширует UTF-8 представление строки в объекте Unicode, и последующие вызовы вернут указатель на тот же буфер. Вызывающая сторона не отвечает за освобождение буфера.
Новое в версии 3.3.
Изменено в версии 3.7: Тип возвращаемого значения теперь
const char *, а неchar *.
-
const char* PyUnicode_AsUTF8(PyObject *unicode) -
Как
PyUnicode_AsUTF8AndSize(), но не сохраняет размер.Новое в версии 3.3.
Изменено в версии 3.7: Тип возвращаемого значения теперь
const char *, а неchar *.
-
PyObject* PyUnicode_EncodeUTF8(const Py_UNICODE *s, Py_ssize_t size, const char *errors) -
Возвращаемое значение: Новая ссылка.
Кодирует буфер
Py_UNICODEsзаданного размераsizeс помощью UTF-8 и возвращает объект Python bytes. ВозвращаетNULLесли кодек поднял исключение.Устарело начиная с версии 3.3, будет удалено в версии 3.11: Часть старого стиля API
Py_UNICODE; пожалуйста, перейдите к использованиюPyUnicode_AsUTF8String(),PyUnicode_AsUTF8AndSize()илиPyUnicode_AsEncodedString().
Кодеки UTF-32
Вот API кодеков UTF-32:
-
PyObject* PyUnicode_DecodeUTF32(const char *s, Py_ssize_t size, const char *errors, int *byteorder) -
Возвращаемое значение: Новая ссылка.
Декодирует
sizeбайт из буфера, закодированного в UTF-32, и возвращает соответствующий объект Unicode.errors(если неNULL) определяет обработку ошибок. По умолчанию — "строгая".Если
byteorderнеNULL, декодер начинает декодирование с заданным порядком байтов:*byteorder == -1: little endian *byteorder == 0: native order *byteorder == 1: big endian
Если
*byteorderравно нулю, а первые четыре байта входных данных — маркер порядка байтов (BOM), декодер переключается на этот порядок байтов, и BOM не копируется в результирующую строку Unicode. Если*byteorderравно-1или1, любой маркер порядка байтов копируется на выход.После завершения
*byteorderустанавливается в текущий порядок байтов в конце входных данных.Если
byteorderравноNULL, кодек запускается в режиме родного порядка.Возвращает
NULLесли кодек поднял исключение.
-
PyObject* PyUnicode_DecodeUTF32Stateful(const char *s, Py_ssize_t size, const char *errors, int *byteorder, Py_ssize_t *consumed) -
Возвращаемое значение: Новая ссылка.
Если
consumedравноNULL, ведет себя какPyUnicode_DecodeUTF32(). Еслиconsumedне равноNULL,PyUnicode_DecodeUTF32Stateful()не будет обрабатывать как ошибку неполные последовательности байтов UTF-32 (например, количество байтов не делится на четыре). Эти байты не будут декодироваться, и количество декодированных байтов будет сохранено вconsumed.
-
PyObject* PyUnicode_AsUTF32String(PyObject *unicode) -
Возвращаемое значение: Новая ссылка.
Возвращает строку Python bytes с использованием кодировки UTF-32 в родном порядке байтов. Строка всегда начинается с маркера BOM.
Обработка ошибок — "строгая". Возвращает
NULLесли кодек поднял исключение.
-
PyObject* PyUnicode_EncodeUTF32(const Py_UNICODE *s, Py_ssize_t size, const char *errors, int byteorder) -
Возвращаемое значение: Новая ссылка.
Возвращает объект Python bytes, содержащий закодированное значение UTF-32 данных Unicode в
s. Вывод записывается в соответствии с следующим порядком байтов:byteorder == -1: little endian byteorder == 0: native byte order (writes a BOM mark) byteorder == 1: big endian
Если
byteorderравно0, выходная строка всегда будет начинаться с маркера BOM Unicode (U+FEFF). В двух других режимах маркер BOM не добавляется.Если
Py_UNICODE_WIDEне определён, пары суррогатов будут выводиться как один код символа.Возвращает
NULLесли кодек поднял исключение.Устарело начиная с версии 3.3, будет удалено в версии 3.11: Часть старого стиля API
Py_UNICODE; пожалуйста, перейдите к использованиюPyUnicode_AsUTF32String()илиPyUnicode_AsEncodedString().
Кодеки UTF-16
Это API кодеков UTF-16:
-
PyObject* PyUnicode_DecodeUTF16(const char *s, Py_ssize_t size, const char *errors, int *byteorder) -
Возвращаемое значение: Новая ссылка.
Декодировать size байт из буфера строки, закодированной в UTF-16, и вернуть соответствующий объект Unicode. errors (если не
NULL) определяет обработку ошибок. По умолчанию — «strict».Если byteorder не
NULL, декодер начинает декодирование с заданного порядка байтов:*byteorder == -1: little endian *byteorder == 0: native order *byteorder == 1: big endian
Если
*byteorderравно нулю, и первые два байта входных данных представляют собой метку порядка байтов (BOM), декодер переключается на этот порядок байтов, а BOM не копируется в результирующую строку Unicode. Если*byteorderравно-1или1, любая метка порядка байтов копируется в выходные данные (где она приведет к символу\ufeffили\ufffe).После завершения *byteorder устанавливается в текущий порядок байтов в конце входных данных.
Если byteorder равно
NULL, кодек начинает работу в режиме родного порядка.Возвращает
NULLесли кодек поднял исключение.
-
PyObject* PyUnicode_DecodeUTF16Stateful(const char *s, Py_ssize_t size, const char *errors, int *byteorder, Py_ssize_t *consumed) -
Возвращаемое значение: Новая ссылка.
Если consumed равно
NULL, ведёт себя какPyUnicode_DecodeUTF16(). Если consumed не равноNULL,PyUnicode_DecodeUTF16Stateful()не будет рассматривать фрагменты неполных последовательностей байтов UTF-16 (такие как нечётное количество байтов или разделительная пара суррогатов) как ошибку. Эти байты не будут декодированы, а количество декодированных байтов будет сохранено в consumed.
-
PyObject* PyUnicode_AsUTF16String(PyObject *unicode) -
Возвращаемое значение: Новая ссылка.
Возвращает строку байтов Python, использующую кодировку UTF-16 в родном порядке байтов. Строка всегда начинается с метки BOM. Обработка ошибок — «strict». Возвращает
NULLесли кодек поднял исключение.
-
PyObject* PyUnicode_EncodeUTF16(const Py_UNICODE *s, Py_ssize_t size, const char *errors, int byteorder) -
Возвращаемое значение: Новая ссылка.
Возвращает объект Python bytes, содержащий закодированное значение данных Unicode в s с использованием кодировки UTF-16. Выходные данные записываются в соответствии со следующим порядком байтов:
byteorder == -1: little endian byteorder == 0: native byte order (writes a BOM mark) byteorder == 1: big endian
Если byteorder равно
0, выходная строка всегда будет начинаться с метки BOM Unicode (U+FEFF). В двух других режимах метка BOM не предваряет строку.Если
Py_UNICODE_WIDEопределено, одно значениеPy_UNICODEможет быть представлено как пара суррогатов. Если оно не определено, каждое значениеPy_UNICODEинтерпретируется как символ UCS-2.Возвращает
NULLесли кодек поднял исключение.Устарело начиная с версии 3.3, будет удалено в версии 3.11: Часть старого API
Py_UNICODE; пожалуйста, перейдите к использованиюPyUnicode_AsUTF16String()илиPyUnicode_AsEncodedString().
Кодеки UTF-7
Это API кодеков UTF-7:
-
PyObject* PyUnicode_DecodeUTF7(const char *s, Py_ssize_t size, const char *errors) -
Возвращаемое значение: Новая ссылка.
Создать объект Unicode, декодировав size байт строки, закодированной в UTF-7, s. Возвращает
NULLесли кодек поднял исключение.
-
PyObject* PyUnicode_DecodeUTF7Stateful(const char *s, Py_ssize_t size, const char *errors, Py_ssize_t *consumed) -
Возвращаемое значение: Новая ссылка.
Если consumed равно
NULL, ведёт себя какPyUnicode_DecodeUTF7(). Если consumed не равноNULL, фрагменты неполных секций UTF-7 base-64 не будут рассматриваться как ошибка. Эти байты не будут декодированы, а количество декодированных байтов будет сохранено в consumed.
-
PyObject* PyUnicode_EncodeUTF7(const Py_UNICODE *s, Py_ssize_t size, int base64SetO, int base64WhiteSpace, const char *errors) -
Возвращаемое значение: Новая ссылка.
Закодировать буфер
Py_UNICODEзаданного размера с использованием UTF-7 и вернуть объект Python bytes. ВозвращаетNULLесли кодек поднял исключение.Если base64SetO ненулевое, «Set O» (знаки препинания, которые не имеют иного специального значения) будут закодированы в base-64. Если base64WhiteSpace ненулевое, пробелы будут закодированы в base-64. Оба установлены в ноль для кодека Python «utf-7».
Устарело начиная с версии 3.3, будет удалено в версии 3.11: Часть старого API
Py_UNICODE; пожалуйста, перейдите к использованиюPyUnicode_AsEncodedString().
Кодеки Unicode-Escape
Это API кодеков «Unicode Escape»:
-
PyObject* PyUnicode_DecodeUnicodeEscape(const char *s, Py_ssize_t size, const char *errors) -
Возвращаемое значение: Новая ссылка.
Создать объект Unicode, декодировав size байт строки, закодированной в Unicode-Escape, s. Возвращает
NULLесли кодек поднял исключение.
-
PyObject* PyUnicode_AsUnicodeEscapeString(PyObject *unicode) -
Возвращаемое значение: Новая ссылка.
Закодировать объект Unicode с использованием Unicode-Escape и вернуть результат в виде объекта bytes. Обработка ошибок — «strict». Возвращает
NULLесли кодек поднял исключение.
-
PyObject* PyUnicode_EncodeUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size) -
Возвращаемое значение: Новая ссылка.
Закодировать буфер
Py_UNICODEзаданного размера с использованием Unicode-Escape и вернуть объект bytes. ВозвращаетNULLесли кодек поднял исключение.Устарело начиная с версии 3.3, будет удалено в версии 3.11: Часть старого API
Py_UNICODE; пожалуйста, перейдите к использованиюPyUnicode_AsUnicodeEscapeString().
Кодеки Raw-Unicode-Escape
Это API кодеков «Raw Unicode Escape»:
-
PyObject* PyUnicode_DecodeRawUnicodeEscape(const char *s, Py_ssize_t size, const char *errors) -
Возвращаемое значение: Новая ссылка.
Создать объект Unicode, декодировав size байт строки, закодированной в Raw-Unicode-Escape, s. Возвращает
NULLесли кодек поднял исключение.
-
PyObject* PyUnicode_AsRawUnicodeEscapeString(PyObject *unicode) -
Возвращаемое значение: Новая ссылка.
Закодировать объект Unicode с использованием Raw-Unicode-Escape и вернуть результат в виде объекта bytes. Обработка ошибок — «strict». Возвращает
NULLесли кодек поднял исключение.
-
PyObject* PyUnicode_EncodeRawUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size) -
Возвращаемое значение: Новая ссылка.
Закодировать буфер
Py_UNICODEзаданного размера с использованием Raw-Unicode-Escape и вернуть объект bytes. ВозвращаетNULLесли кодек поднял исключение.Устарело начиная с версии 3.3, будет удалено в версии 3.11: Часть старого API
Py_UNICODE; пожалуйста, перейдите к использованиюPyUnicode_AsRawUnicodeEscapeString()илиPyUnicode_AsEncodedString().
Кодеки Latin-1
Это API кодеков Latin-1: Latin-1 соответствует первым 256 порядковым номерам Unicode, и только они принимаются кодеками во время кодирования.
-
PyObject* PyUnicode_DecodeLatin1(const char *s, Py_ssize_t size, const char *errors) -
Возвращаемое значение: Новая ссылка.
Создать объект Unicode, декодировав size байт строки, закодированной в Latin-1, s. Возвращает
NULLесли кодек поднял исключение.
-
PyObject* PyUnicode_AsLatin1String(PyObject *unicode) -
Возвращаемое значение: Новая ссылка.
Закодировать объект Unicode с использованием Latin-1 и вернуть результат в виде объекта Python bytes. Обработка ошибок — «strict». Возвращает
NULLесли кодек поднял исключение.
-
PyObject* PyUnicode_EncodeLatin1(const Py_UNICODE *s, Py_ssize_t size, const char *errors) -
Возвращаемое значение: Новая ссылка.
Закодировать буфер
Py_UNICODEзаданного размера с использованием Latin-1 и вернуть объект Python bytes. ВозвращаетNULLесли кодек поднял исключение.Устарело начиная с версии 3.3, будет удалено в версии 3.11: Часть старого API
Py_UNICODE; пожалуйста, перейдите к использованиюPyUnicode_AsLatin1String()илиPyUnicode_AsEncodedString().
Кодировки ASCII
Это API кодировок ASCII. Принимаются только данные ASCII 7-битного формата. Все другие коды генерируют ошибки.
-
PyObject* PyUnicode_DecodeASCII(const char *s, Py_ssize_t size, const char *errors) -
Значение возврата: новая ссылка.
Создать объект Unicode, декодировав size байт ASCII-строки s. Возвратить
NULLесли обработчик кодировки вызвал исключение.
-
PyObject* PyUnicode_AsASCIIString(PyObject *unicode) -
Значение возврата: новая ссылка.
Кодировать объект Unicode в ASCII и вернуть результат в виде объекта Python bytes. Обработка ошибок — «строгая». Возвратить
NULLесли обработчик кодировки вызвал исключение.
-
PyObject* PyUnicode_EncodeASCII(const Py_UNICODE *s, Py_ssize_t size, const char *errors) -
Значение возврата: новая ссылка.
Кодировать буфер
Py_UNICODEзаданного размера с использованием ASCII и вернуть объект Python bytes. ВозвратитьNULLесли обработчик кодировки вызвал исключение.Устарело начиная с версии 3.3, будет удалено в версии 3.11: Часть старого API
Py_UNICODE; переходите к использованиюPyUnicode_AsASCIIString()илиPyUnicode_AsEncodedString().
Кодировки таблиц символов
Этот кодек является специальным, так как может использоваться для реализации многих разных кодировок (и именно так были получены большинство стандартных кодировок, включенных в encodings пакет). Кодек использует отображение для кодирования и декодирования символов. Объекты отображения, которые предоставляются, должны поддерживать интерфейс отображения __getitem__(); словари и последовательности работают хорошо.
Это API кодеков отображения:
-
PyObject* PyUnicode_DecodeCharmap(const char *data, Py_ssize_t size, PyObject *mapping, const char *errors) -
Значение возврата: новая ссылка.
Создать объект Unicode, декодировав size байт закодированной строки s с использованием заданного объекта mapping. Возвратить
NULLесли обработчик кодировки вызвал исключение.Если mapping —
NULL, будет применено декодирование Latin-1. В противном случае mapping должен сопоставлять порядковые номера байтов (целые числа в диапазоне от 0 до 255) со строками Unicode, целыми числами (которые затем интерпретируются как порядковые номера Unicode) илиNone. Неотображенные байты данных — те, которые вызываютLookupError, а также те, которые сопоставлены сNone,0xFFFEили'\ufffe', обрабатываются как неопределенные отображения и вызывают ошибку.
-
PyObject* PyUnicode_AsCharmapString(PyObject *unicode, PyObject *mapping) -
Значение возврата: новая ссылка.
Кодировать объект Unicode с использованием заданного объекта mapping и вернуть результат в виде объекта bytes. Обработка ошибок — «строгая». Возвратить
NULLесли обработчик кодировки вызвал исключение.Объект mapping должен сопоставлять целые числа порядковых номеров Unicode с объектами bytes, целыми числами в диапазоне от 0 до 255 или
None. Неотображенные порядковые номера символов (которые вызываютLookupError), а также сопоставленные сNone, обрабатываются как «неопределенное отображение» и вызывают ошибку.
-
PyObject* PyUnicode_EncodeCharmap(const Py_UNICODE *s, Py_ssize_t size, PyObject *mapping, const char *errors) -
Значение возврата: новая ссылка.
Кодировать буфер
Py_UNICODEзаданного размера с использованием заданного объекта mapping и вернуть результат в виде объекта bytes. ВозвратитьNULLесли обработчик кодировки вызвал исключение.Устарело начиная с версии 3.3, будет удалено в версии 3.11: Часть старого API
Py_UNICODE; переходите к использованиюPyUnicode_AsCharmapString()илиPyUnicode_AsEncodedString().
Следующий API кодека является специальным, так как отображает Unicode в Unicode.
-
PyObject* PyUnicode_Translate(PyObject *str, PyObject *table, const char *errors) -
Значение возврата: новая ссылка.
Преобразовать строку, применив к ней таблицу отображения символов, и вернуть получившийся объект Unicode. Возвратить
NULLесли обработчик кодировки вызвал исключение.Таблица отображения должна сопоставлять целые числа порядковых номеров Unicode с целыми числами порядковых номеров Unicode или
None(вызывая удаление символа).Таблицы отображения должны только предоставлять интерфейс
__getitem__(); словари и последовательности работают хорошо. Неотображенные порядковые номера символов (которые вызываютLookupError) оставляются без изменений и копируются как есть.errors имеет обычное значение для кодировок. Это может быть
NULL, что указывает на использование обработки ошибок по умолчанию.
-
PyObject* PyUnicode_TranslateCharmap(const Py_UNICODE *s, Py_ssize_t size, PyObject *mapping, const char *errors) -
Значение возврата: новая ссылка.
Преобразовать буфер
Py_UNICODEзаданного размера, применив к нему таблицу отображения символов, и вернуть получившийся объект Unicode. ВозвратитьNULLпри возникновении исключения обработчиком кодировки.Устарело начиная с версии 3.3, будет удалено в версии 3.11: Часть старого API
Py_UNICODE; переходите к использованиюPyUnicode_Translate()или общего API кодека
Кодировки MBCS для Windows
Это API кодировок MBCS. В настоящее время они доступны только в Windows и используют преобразователи MBCS Win32 для реализации преобразований. Обратите внимание, что MBCS (или DBCS) — это класс кодировок, а не одна кодировка. Целевая кодировка определяется настройками пользователя на машине, на которой выполняется кодек.
-
PyObject* PyUnicode_DecodeMBCS(const char *s, Py_ssize_t size, const char *errors) -
Значение возврата: новая ссылка.
Создать объект Unicode, декодировав size байт MBCS-строки s. Возвратить
NULLесли обработчик кодировки вызвал исключение.
-
PyObject* PyUnicode_DecodeMBCSStateful(const char *s, Py_ssize_t size, const char *errors, Py_ssize_t *consumed) -
Значение возврата: новая ссылка.
Если consumed —
NULL, вести себя какPyUnicode_DecodeMBCS(). Если consumed неNULL,PyUnicode_DecodeMBCSStateful()не будет декодировать заключительный стартовый байт, а количество декодированных байтов будет сохранено в consumed.
-
PyObject* PyUnicode_AsMBCSString(PyObject *unicode) -
Значение возврата: новая ссылка.
Кодировать объект Unicode с использованием MBCS и вернуть результат в виде объекта Python bytes. Обработка ошибок — «строгая». Возвратить
NULLесли обработчик кодировки вызвал исключение.
-
PyObject* PyUnicode_EncodeCodePage(int code_page, PyObject *unicode, const char *errors) -
Значение возврата: новая ссылка.
Кодировать объект Unicode с использованием указанной кодовой страницы и вернуть объект Python bytes. Возвратить
NULLесли обработчик кодировки вызвал исключение. Используйте кодовую страницуCP_ACPдля получения кодера MBCS.Добавлена в версии 3.3.
-
PyObject* PyUnicode_EncodeMBCS(const Py_UNICODE *s, Py_ssize_t size, const char *errors) -
Значение возврата: новая ссылка.
Кодировать буфер
Py_UNICODEзаданного размера с использованием MBCS и вернуть объект Python bytes. ВозвратитьNULLесли обработчик кодировки вызвал исключение.Устарело начиная с версии 3.3, будет удалено в версии 4.0: Часть старого API
Py_UNICODE; переходите к использованиюPyUnicode_AsMBCSString(),PyUnicode_EncodeCodePage()илиPyUnicode_AsEncodedString().
Методы и слоты
Методы и функции слотов
Следующие API могут обрабатывать объекты и строки Юникода на входе (в описаниях мы будем называть их строками) и возвращать объекты Юникода или целые числа в зависимости от ситуации.
Все они возвращают NULL или -1 в случае возникновения исключения.
-
PyObject* PyUnicode_Concat(PyObject *left, PyObject *right) -
Значение возврата: Новая ссылка.
Конкатенация двух строк, возвращающая новую строку Юникода.
-
PyObject* PyUnicode_Split(PyObject *s, PyObject *sep, Py_ssize_t maxsplit) -
Значение возврата: Новая ссылка.
Разделение строки, возвращающее список строк Юникода. Если sep равно
NULL, разделение выполняется по всем подстрокам пробелов. В противном случае разделение происходит по заданному разделителю. Максимальное количество разделений maxsplit. Если значение отрицательное, ограничение не устанавливается. Разделители не включаются в результирующий список.
-
PyObject* PyUnicode_Splitlines(PyObject *s, int keepend) -
Значение возврата: Новая ссылка.
Разделение строки Юникода по символам перевода строки, возвращающее список строк Юникода. CRLF считается одной строкой. Если keepend равно
0, символы перевода строки не включаются в результирующие строки.
-
PyObject* PyUnicode_Join(PyObject *separator, PyObject *seq) -
Значение возврата: Новая ссылка.
Объединение последовательности строк с использованием заданного разделителя и возвращение результирующей строки Юникода.
-
Py_ssize_t PyUnicode_Tailmatch(PyObject *str, PyObject *substr, Py_ssize_t start, Py_ssize_t end, int direction) -
Возвращает
1если substr совпадает сstr[start:end]в заданном конце (direction ==-1означает поиск в начале строки, direction ==1означает поиск в конце),0в противном случае. Возвращает-1в случае ошибки.
-
Py_ssize_t PyUnicode_Find(PyObject *str, PyObject *substr, Py_ssize_t start, Py_ssize_t end, int direction) -
Возвращает первое положение substr в
str[start:end]с использованием заданного direction (direction ==1означает поиск вперед, direction ==-1поиск назад). Значение возврата — индекс первого совпадения; значение-1указывает, что совпадение не найдено, а-2указывает, что произошла ошибка и было установлено исключение.
-
Py_ssize_t PyUnicode_FindChar(PyObject *str, Py_UCS4 ch, Py_ssize_t start, Py_ssize_t end, int direction) -
Возвращает первое положение символа ch в
str[start:end]с использованием заданного direction (direction ==1означает поиск вперед, direction ==-1поиск назад). Значение возврата — индекс первого совпадения; значение-1указывает, что совпадение не найдено, а-2указывает, что произошла ошибка и было установлено исключение.Новое в версии 3.3.
Изменено в версии 3.7: start и end теперь корректируются так, чтобы вести себя как
str[start:end].
-
Py_ssize_t PyUnicode_Count(PyObject *str, PyObject *substr, Py_ssize_t start, Py_ssize_t end) -
Возвращает количество неперекрывающихся вхождений substr в
str[start:end]. Возвращает-1в случае ошибки.
-
PyObject* PyUnicode_Replace(PyObject *str, PyObject *substr, PyObject *replstr, Py_ssize_t maxcount) -
Значение возврата: Новая ссылка.
Заменяет не более maxcount вхождений substr в str на replstr и возвращает результирующий объект Юникода. maxcount ==
-1означает замену всех вхождений.
-
int PyUnicode_Compare(PyObject *left, PyObject *right) -
Сравнивает две строки и возвращает
-1,0,1для меньше, равно и больше соответственно.Эта функция возвращает
-1при ошибке, поэтому необходимо вызыватьPyErr_Occurred()для проверки ошибок.
-
int PyUnicode_CompareWithASCIIString(PyObject *uni, const char *string) -
Сравнивает объект Юникода uni со строкой string и возвращает
-1,0,1для меньше, равно и больше соответственно. Лучше всего передавать только ASCII-строки, но функция интерпретирует входную строку как ISO-8859-1, если она содержит не-ASCII символы.Эта функция не вызывает исключений.
-
PyObject* PyUnicode_RichCompare(PyObject *left, PyObject *right, int op) -
Значение возврата: Новая ссылка.
Подробное сравнение двух строк Юникода и возвращение одного из следующего:
-
NULLв случае возникновения исключения -
Py_TrueилиPy_Falseдля успешных сравнений -
Py_NotImplementedв случае неизвестной комбинации типов
Возможные значения для op это
Py_GT,Py_GE,Py_EQ,Py_NE,Py_LT, иPy_LE. -
-
PyObject* PyUnicode_Format(PyObject *format, PyObject *args) -
Значение возврата: Новая ссылка.
Возвращает новую строку из format и args; это аналогично
format % args.
-
int PyUnicode_Contains(PyObject *container, PyObject *element) -
Проверка, содержится ли element в container, и возвращение соответствующего значения true или false.
element должен быть преобразован в строку Юникода из одного элемента.
-1возвращается в случае ошибки.
-
void PyUnicode_InternInPlace(PyObject **string) -
Интернирование аргумента *string на месте. Аргумент должен быть адресом переменной-указателя, указывающей на объект Python-строки Юникода. Если существует уже интернированная строка, которая идентична *string, она устанавливает *string на неё (уменьшая счётчик ссылок старой строки и увеличивая счётчик ссылок интернированной строки), в противном случае она оставляет *string без изменений и интернирует её (увеличивая её счётчик ссылок). (Пояснение: несмотря на многочисленные упоминания о счётчиках ссылок, подумайте об этой функции как о нейтральной по отношению к счётчикам ссылок; вы владеете объектом после вызова, если и только если вы владели им до вызова.)
-
PyObject* PyUnicode_InternFromString(const char *v) -
Значение возврата: Новая ссылка.
Комбинация
PyUnicode_FromString()иPyUnicode_InternInPlace(), возвращающая либо новую строку Юникода, которая была интернирована, либо новую ("владеемую") ссылку на ранее интернированную строку с тем же значением.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/c-api/unicode.html