Объекты Unicode и кодеки
Объекты Unicode
Начиная с реализации PEP 393 в Python 3.3, объекты Unicode внутри используют различные представления, чтобы обрабатывать весь диапазон символов Unicode и при этом эффективно использовать память. Для строк, в которых все кодовые точки меньше 128, 256 или 65536, предусмотрены особые случаи; в остальных случаях кодовые точки должны быть меньше 1114112 (то есть находиться в полном диапазоне Unicode).
Представление UTF-8 создаётся по запросу и кэшируется в объекте Unicode.
Примечание
Представление Py_UNICODE было удалено в Python 3.12 вместе с устаревшими API. Дополнительные сведения см. в PEP 623.
Тип Unicode
Ниже перечислены основные типы объектов Unicode, используемые при реализации Unicode в Python:
-
PyTypeObject PyUnicode_Type -
Входит в стабильный ABI.
Этот экземпляр
PyTypeObjectпредставляет тип Unicode в Python. В коде Python он доступен какstr.
-
PyTypeObject PyUnicodeIter_Type -
Входит в стабильный ABI.
Этот экземпляр
PyTypeObjectпредставляет тип итератора Unicode в Python. Он используется для перебора объектов строк Unicode.
-
type Py_UCS4 -
type Py_UCS2 -
type Py_UCS1 -
Входит в стабильный ABI.
Эти типы являются псевдонимами беззнаковых целочисленных типов, достаточно широких для хранения символов размером соответственно 32, 16 и 8 бит. При работе с отдельными символами Unicode используйте
Py_UCS4.Добавлено в версии 3.3.
-
type PyASCIIObject -
type PyCompactUnicodeObject -
type PyUnicodeObject -
Эти подтипы
PyObjectпредставляют объект Unicode в Python. Почти во всех случаях их не следует использовать напрямую, поскольку все функции API, работающие с объектами Unicode, принимают и возвращают указателиPyObject.Добавлено в версии 3.3.
Структуру конкретного объекта можно определить с помощью следующих макросов. Макросы не могут завершиться с ошибкой; если аргумент не является объектом Unicode в Python, их поведение не определено.
-
PyUnicode_IS_COMPACT(o) -
Истина, если o использует структуру
PyCompactUnicodeObject.Добавлено в версии 3.3.
-
PyUnicode_IS_COMPACT_ASCII(o) -
Истина, если o использует структуру
PyASCIIObject.Добавлено в версии 3.3.
-
Следующие API — это макросы C и статические встроенные функции для быстрой проверки и доступа к внутренним данным объектов Unicode, доступным только для чтения:
-
int PyUnicode_Check(PyObject *obj) -
Возвращает true, если объект obj является объектом Unicode или экземпляром подтипа Unicode. Эта функция всегда завершается успешно.
-
int PyUnicode_CheckExact(PyObject *obj) -
Возвращает true, если объект obj является объектом Unicode, но не экземпляром подтипа. Эта функция всегда завершается успешно.
-
Py_ssize_t PyUnicode_GET_LENGTH(PyObject *unicode) -
Возвращает длину строки Unicode в кодовых точках. unicode должен быть объектом Unicode в «каноническом» представлении (проверка не выполняется).
Добавлено в версии 3.3.
-
Py_UCS1 *PyUnicode_1BYTE_DATA(PyObject *unicode) -
Py_UCS2 *PyUnicode_2BYTE_DATA(PyObject *unicode) -
Py_UCS4 *PyUnicode_4BYTE_DATA(PyObject *unicode) -
Возвращает указатель на каноническое представление, приведённое к целочисленным типам UCS1, UCS2 или UCS4, для прямого доступа к символам. Проверки соответствия размера символа каноническому представлению не выполняются; для выбора подходящей функции используйте
PyUnicode_KIND().Добавлено в версии 3.3.
-
PyUnicode_1BYTE_KIND -
PyUnicode_2BYTE_KIND -
PyUnicode_4BYTE_KIND -
Возвращаемые значения макроса
PyUnicode_KIND().Добавлено в версии 3.3.
Изменено в версии 3.12:
PyUnicode_WCHAR_KINDудалён.
-
int PyUnicode_KIND(PyObject *unicode) -
Возвращает одну из констант PyUnicode kind (см. выше), указывающих, сколько байт на символ использует этот объект Unicode для хранения данных. unicode должен быть объектом Unicode в «каноническом» представлении (проверка не выполняется).
Добавлено в версии 3.3.
-
void *PyUnicode_DATA(PyObject *unicode) -
Возвращает указатель void на необработанный буфер Unicode. unicode должен быть объектом Unicode в «каноническом» представлении (проверка не выполняется).
Добавлено в версии 3.3.
-
void PyUnicode_WRITE(int kind, void *data, Py_ssize_t index, Py_UCS4 value) -
Записывает кодовую точку value по указанному индексу index строки (индексация начинается с нуля).
Значение kind и указатель data должны быть получены из строки с помощью
PyUnicode_KIND()иPyUnicode_DATA()соответственно. При вызовеPyUnicode_WRITE()необходимо удерживать ссылку на эту строку. Также применяются все требованияPyUnicode_WriteChar().Функция не проверяет соблюдение каких-либо своих требований и предназначена для использования в циклах.
Добавлено в версии 3.3.
-
Py_UCS4 PyUnicode_READ(int kind, void *data, Py_ssize_t index) -
Считывает кодовую точку из канонического представления data (полученного с помощью
PyUnicode_DATA()). Проверки и вызовы ready не выполняются.Добавлено в версии 3.3.
-
Py_UCS4 PyUnicode_READ_CHAR(PyObject *unicode, Py_ssize_t index) -
Считывает символ из объекта Unicode unicode, который должен быть в «каноническом» представлении. При нескольких последовательных чтениях это менее эффективно, чем
PyUnicode_READ().Добавлено в версии 3.3.
-
Py_UCS4 PyUnicode_MAX_CHAR_VALUE(PyObject *unicode) -
Возвращает максимальную кодовую точку, подходящую для создания другой строки на основе unicode, который должен быть в «каноническом» представлении. Это значение всегда является приближённым, но его вычисление эффективнее перебора строки.
Добавлено в версии 3.3.
-
int PyUnicode_IsIdentifier(PyObject *unicode) -
Входит в стабильный ABI.
Возвращает
1, если строка является допустимым идентификатором согласно определению языка, разделу Имена (идентификаторы и ключевые слова). В противном случае возвращает0.Изменено в версии 3.9: Функция больше не вызывает
Py_FatalError(), если строка не готова.
-
unsigned int PyUnicode_IS_ASCII(PyObject *unicode) -
Возвращает true, если строка содержит только символы ASCII. Эквивалентно
str.isascii().Добавлено в версии 3.2.
Свойства символов Unicode
Unicode определяет множество различных свойств символов. Наиболее востребованные из них доступны через следующие макросы, которые в зависимости от конфигурации Python сопоставляются с функциями C.
-
int Py_UNICODE_ISSPACE(Py_UCS4 ch) -
Возвращает
1или0в зависимости от того, является ли ch пробельным символом.
-
int Py_UNICODE_ISLOWER(Py_UCS4 ch) -
Возвращает
1или0в зависимости от того, является ли ch символом в нижнем регистре.
-
int Py_UNICODE_ISUPPER(Py_UCS4 ch) -
Возвращает
1или0в зависимости от того, является ли ch символом в верхнем регистре.
-
int Py_UNICODE_ISTITLE(Py_UCS4 ch) -
Возвращает
1или0в зависимости от того, является ли ch символом в регистре заголовка.
-
int Py_UNICODE_ISLINEBREAK(Py_UCS4 ch) -
Возвращает
1или0в зависимости от того, является ли ch символом перевода строки.
-
int Py_UNICODE_ISDECIMAL(Py_UCS4 ch) -
Возвращает
1или0в зависимости от того, является ли ch десятичным символом.
-
int Py_UNICODE_ISDIGIT(Py_UCS4 ch) -
Возвращает
1или0в зависимости от того, является ли ch цифрой.
-
int Py_UNICODE_ISNUMERIC(Py_UCS4 ch) -
Возвращает
1или0в зависимости от того, является ли ch числовым символом.
-
int Py_UNICODE_ISALPHA(Py_UCS4 ch) -
Возвращает
1или0в зависимости от того, является ли ch буквенным символом.
-
int Py_UNICODE_ISALNUM(Py_UCS4 ch) -
Возвращает
1или0в зависимости от того, является ли ch буквенно-цифровым символом.
-
int Py_UNICODE_ISPRINTABLE(Py_UCS4 ch) -
Возвращает
1или0в зависимости от того, является ли ch печатным символом в смыслеstr.isprintable().
Эти API можно использовать для быстрого непосредственного преобразования символов:
-
Py_UCS4 Py_UNICODE_TOLOWER(Py_UCS4 ch) -
Возвращает символ ch, преобразованный в нижний регистр.
-
Py_UCS4 Py_UNICODE_TOUPPER(Py_UCS4 ch) -
Возвращает символ ch, преобразованный в верхний регистр.
-
Py_UCS4 Py_UNICODE_TOTITLE(Py_UCS4 ch) -
Возвращает символ ch, преобразованный в регистр заголовка.
-
int Py_UNICODE_TODECIMAL(Py_UCS4 ch) -
Возвращает символ ch, преобразованный в положительное десятичное целое число. Если это невозможно, возвращает
-1. Эта функция не вызывает исключений.
-
int Py_UNICODE_TODIGIT(Py_UCS4 ch) -
Возвращает символ ch, преобразованный в целое число от 0 до 9. Если это невозможно, возвращает
-1. Эта функция не вызывает исключений.
-
double Py_UNICODE_TONUMERIC(Py_UCS4 ch) -
Возвращает символ ch, преобразованный в число с плавающей точкой двойной точности. Если это невозможно, возвращает
-1.0. Эта функция не вызывает исключений.
Эти API можно использовать для работы с суррогатами:
-
int Py_UNICODE_IS_SURROGATE(Py_UCS4 ch) -
Проверяет, является ли ch суррогатом (
0xD800 <= ch <= 0xDFFF).
-
int Py_UNICODE_IS_HIGH_SURROGATE(Py_UCS4 ch) -
Проверяет, является ли ch старшим суррогатом (
0xD800 <= ch <= 0xDBFF).
-
int Py_UNICODE_IS_LOW_SURROGATE(Py_UCS4 ch) -
Проверяет, является ли ch младшим суррогатом (
0xDC00 <= ch <= 0xDFFF).
-
Py_UCS4 Py_UNICODE_HIGH_SURROGATE(Py_UCS4 ch) -
Возвращает старший суррогат UTF-16 (от
0xD800до0xDBFF) для кодовой точки Unicode в диапазоне[0x10000; 0x10FFFF].
-
Py_UCS4 Py_UNICODE_LOW_SURROGATE(Py_UCS4 ch) -
Возвращает младший суррогат UTF-16 (от
0xDC00до0xDFFF) для кодовой точки Unicode в диапазоне[0x10000; 0x10FFFF].
-
Py_UCS4 Py_UNICODE_JOIN_SURROGATES(Py_UCS4 high, Py_UCS4 low) -
Объединяет две кодовые точки-суррогата и возвращает одно значение
Py_UCS4. high и low — соответственно ведущий и замыкающий суррогаты в суррогатной паре. high должен находиться в диапазоне[0xD800; 0xDBFF], а low — в диапазоне[0xDC00; 0xDFFF].
Создание строк Unicode и доступ к ним
Для создания объектов Unicode и доступа к их основным свойствам последовательности используйте следующие API:
-
PyObject *PyUnicode_New(Py_ssize_t size, Py_UCS4 maxchar) -
Возвращаемое значение: новая ссылка.
Создайте новый объект Unicode. maxchar должен быть максимальным кодом символа, который будет помещён в строку. Для приблизительной оценки его можно округлить вверх до ближайшего значения в последовательности 127, 255, 65535, 1114111.
При ошибке установите исключение и верните
NULL.После создания строку можно заполнить с помощью
PyUnicode_WriteChar(),PyUnicode_CopyCharacters(),PyUnicode_Fill(),PyUnicode_WRITE()или аналогичных функций. Поскольку строки считаются неизменяемыми, не используйте результат во время его изменения. В частности, пока строка не заполнена окончательным содержимым:- её нельзя хешировать,
- её нельзя преобразовывать с помощью
converted to UTF-8или в другое неканоническое представление, - нельзя изменять её счётчик ссылок,
- её нельзя передавать коду, который может выполнить что-либо из перечисленного выше.
Этот список не является исчерпывающим. Вы несёте ответственность за то, чтобы не использовать строку таким образом; Python не всегда проверяет соблюдение этих требований.
Чтобы случайно не предоставить доступ к частично записанному объекту строки, предпочтительно использовать API
PyUnicodeWriterили одну из приведённых ниже функцийPyUnicode_From*.Добавлено в версии 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 байта на символ, в соответствии с указанным видом.При необходимости входной buffer копируется и преобразуется в каноническое представление. Например, если buffer — строка UCS4 (
PyUnicode_4BYTE_KIND) и она состоит только из кодовых точек диапазона UCS1, она будет преобразована в UCS1 (PyUnicode_1BYTE_KIND).Добавлено в версии 3.3.
-
PyObject *PyUnicode_FromStringAndSize(const char *str, Py_ssize_t size) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Создайте объект Unicode из буфера символов str. Байты будут интерпретироваться как закодированные в UTF-8. Буфер копируется в новый объект. Возвращаемое значение может быть совместно используемым объектом, то есть изменять данные нельзя.
Эта функция вызывает
SystemErrorв следующих случаях:- size < 0,
-
str равен
NULL, а size > 0
Изменено в версии 3.12: использование str ==
NULLпри size > 0 больше не допускается.
-
PyObject *PyUnicode_FromString(const char *str) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Создайте объект Unicode из буфера символов str, закодированного в UTF-8 и завершающегося нулевым символом.
-
PyObject *PyUnicode_FromFormat(const char *format, ...) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Примите строку format в стиле C
printf()и переменное число аргументов, вычислите размер результирующей строки Unicode Python и верните строку с отформатированными значениями. Аргументы переменной длины должны иметь типы C и точно соответствовать символам формата в строке format, закодированной в ASCII.Спецификатор преобразования состоит из двух или более символов и содержит следующие компоненты, которые должны идти в указанном порядке:
- Символ
'%', обозначающий начало спецификатора. - Флаги преобразования (необязательно), влияющие на результат некоторых типов преобразования.
- Минимальная ширина поля (необязательно). Если задана как
'*'(звёздочка), фактическая ширина задаётся следующим аргументом, который должен иметь тип int; объект для преобразования указывается после минимальной ширины поля и необязательной точности. - Точность (необязательно), задаваемая как
'.'(точка) с последующим значением точности. Если задана как'*'(звёздочка), фактическая точность задаётся следующим аргументом, который должен иметь тип int; значение для преобразования указывается после точности. - Модификатор длины (необязательно).
- Тип преобразования.
Символы флагов преобразования:
Флаг
Значение
0Для числовых значений преобразование дополняется нулями.
-Преобразованное значение выравнивается по левому краю (переопределяет флаг
0, если указаны оба).Модификаторы длины для следующих преобразований целых чисел (
d,i,o,u,xилиX) задают тип аргумента (по умолчанию int):Модификатор
Типы
llong или unsigned long
lllong long или unsigned long long
jintmax_tилиuintmax_tzsize_tилиssize_ttptrdiff_tМодификатор длины
lдля следующих преобразованийsилиVуказывает, что тип аргумента — const wchar_t*.Спецификаторы преобразования:
Спецификатор преобразования
Тип
Комментарий
%не применимо
Буквальный символ
%.d,iЗадаётся модификатором длины
Десятичное представление знакового целого числа C.
uЗадаётся модификатором длины
Десятичное представление беззнакового целого числа C.
oЗадаётся модификатором длины
Восьмеричное представление беззнакового целого числа C.
xЗадаётся модификатором длины
Шестнадцатеричное представление беззнакового целого числа C (строчными буквами).
XЗадаётся модификатором длины
Шестнадцатеричное представление беззнакового целого числа C (прописными буквами).
cint
Один символ.
sconst char* или const wchar_t*
Массив символов C, завершающийся нулевым символом.
pconst void*
Шестнадцатеричное представление указателя C. В основном эквивалентно
printf("%p"), но гарантированно начинается с буквального0xнезависимо от результатаprintfна данной платформе.AРезультат вызова
ascii().UОбъект Unicode.
VPyObject*, const char* или const wchar_t*
Объект Unicode (который может быть
NULL) и массив символов C, завершающийся нулевым символом, в качестве второго параметра (он будет использоваться, если первый параметр равенNULL).SРезультат вызова
PyObject_Str().RРезультат вызова
PyObject_Repr().TПолучить полное имя объекта типа; вызвать
PyType_GetFullyQualifiedName().#TАналогично формату
T, но в качестве разделителя между именем модуля и полным именем используется двоеточие (:).NПолучить полное имя типа; вызвать
PyType_GetFullyQualifiedName().#NАналогично формату
N, но в качестве разделителя между именем модуля и полным именем используется двоеточие (:).Примечание
Единицей измерения ширины является число символов, а не байтов. Единицей измерения точности является число байтов или элементов
wchar_t(если используется модификатор длиныl) для"%s"и"%V"(если аргументPyObject*равенNULL), а также число символов для"%A","%U","%S","%R"и"%V"(если аргументPyObject*не равенNULL).Примечание
В отличие от C
printf(), флаг0действует даже при заданной точности для преобразований целых чисел (d,i,u,o,xилиX).Изменено в версии 3.2: добавлена поддержка
"%lld"и"%llu".Изменено в версии 3.3: добавлена поддержка
"%li","%lli"и"%zi".Изменено в версии 3.4: добавлена поддержка форматирования ширины и точности для
"%s","%A","%U","%V","%S","%R".Изменено в версии 3.12: добавлена поддержка спецификаторов преобразования
oиX. Добавлена поддержка модификаторов длиныjиt. Теперь модификаторы длины применяются ко всем преобразованиям целых чисел. Модификатор длиныlтеперь применяется к спецификаторам преобразованияsиV. Добавлена поддержка переменной ширины и точности*. Добавлена поддержка флага-.Теперь нераспознанный символ формата вызывает
SystemError. В предыдущих версиях оставшаяся часть строки формата копировалась в результирующую строку без изменений, а все дополнительные аргументы отбрасывались.Изменено в версии 3.13: добавлена поддержка форматов
%T,%#T,%Nи%#N. - Символ
-
PyObject *PyUnicode_FromFormatV(const char *format, va_list vargs) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Идентична
PyUnicode_FromFormat(), но принимает ровно два аргумента.
-
PyObject *PyUnicode_FromObject(PyObject *obj) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
При необходимости скопируйте экземпляр подкласса Unicode в новый объект Unicode. Если obj уже является полноценным объектом Unicode (не подклассом), верните новую сильную ссылку на объект.
Объекты, не являющиеся Unicode или его подклассами, вызовут исключение
TypeError.
-
PyObject *PyUnicode_FromOrdinal(int ordinal) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Создайте объект Unicode из заданной кодовой точки Unicode ordinal.
Порядковый номер должен находиться в диапазоне
range(0x110000). Если это не так, вызывается исключениеValueError.
-
PyObject *PyUnicode_FromEncodedObject(PyObject *obj, const char *encoding, const char *errors) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Декодируйте закодированный объект obj в объект Unicode.
bytes,bytearrayи другие объекты, подобные байтам декодируются с использованием заданной encoding и обработки ошибок, определённой параметром errors. Оба параметра можно задать какNULL, чтобы интерфейс использовал значения по умолчанию (подробности см. в разделе Встроенные кодеки).Все остальные объекты, включая объекты Unicode, приводят к установке исключения
TypeError.При ошибке API возвращает
NULL. Вызывающий код отвечает за уменьшение счётчика ссылок возвращённых объектов.
-
void PyUnicode_Append(PyObject **p_left, PyObject *right) -
Часть стабильного ABI.
Добавьте строку right в конец p_left. p_left должен указывать на сильную ссылку на объект Unicode;
PyUnicode_Append()освобождает (то есть «забирает») эту ссылку.При ошибке установите для *p_left значение
NULLи установите исключение.При успешном выполнении присвойте *p_left новую сильную ссылку на результат.
-
void PyUnicode_AppendAndDel(PyObject **p_left, PyObject *right) -
Часть стабильного ABI.
Функция аналогична
PyUnicode_Append(), но уменьшает счётчик ссылок right на единицу.
-
PyObject *PyUnicode_BuildEncodingMap(PyObject *string) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Верните таблицу соответствий, подходящую для декодирования пользовательской однобайтовой кодировки. Для строки Unicode string длиной не более 256 символов, представляющей таблицу кодировки, возвращается компактный внутренний объект соответствий либо словарь, сопоставляющий порядковые номера символов значениям байтов. При некорректных входных данных вызывается исключение
TypeErrorи возвращаетсяNULL.Добавлено в версии 3.2.
-
const char *PyUnicode_GetDefaultEncoding(void) -
Часть стабильного ABI.
Верните имя кодировки строк по умолчанию:
"utf-8". См.sys.getdefaultencoding().Возвращённую строку не нужно освобождать; она действительна до завершения работы интерпретатора.
-
Py_ssize_t PyUnicode_GetLength(PyObject *unicode) -
Часть стабильного ABI начиная с версии 3.7.
Верните длину объекта Unicode в кодовых точках.
При ошибке установите исключение и верните
-1.Добавлено в версии 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и устанавливает исключение; в противном случае возвращает количество скопированных символов.Строка ещё не должна была использоваться. Подробности см. в описании
PyUnicode_New().Добавлено в версии 3.3.
-
int PyUnicode_Resize(PyObject **unicode, Py_ssize_t length); -
Часть стабильного ABI.
Измените размер объекта Unicode *unicode, задав новую length в кодовых точках.
Попытайтесь изменить размер строки на месте (обычно это быстрее, чем выделять память для новой строки и копировать символы) либо создайте новую строку.
*unicode изменяется так, чтобы указывать на новый объект (с изменённым размером); при успехе возвращается
0. В противном случае возвращается-1и устанавливается исключение, а *unicode остаётся без изменений.Функция не проверяет содержимое строки; результат может не быть строкой в каноническом представлении.
-
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 больше максимального символа строки или если у строки больше одной ссылки.
Строка ещё не должна была использоваться. Подробности см. в описании
PyUnicode_New().Верните число записанных символов либо верните
-1и вызовите исключение при ошибке.Добавлено в версии 3.3.
-
int PyUnicode_WriteChar(PyObject *unicode, Py_ssize_t index, Py_UCS4 character) -
Часть стабильного ABI начиная с версии 3.7.
Запишите character в строку unicode по индексу index, отсчитываемому от нуля. При успехе верните
0; при ошибке верните-1и установите исключение.Эта функция проверяет, что unicode является объектом Unicode, индекс не выходит за границы, а счётчик ссылок объекта равен единице. Вариант
PyUnicode_WRITE()пропускает эти проверки, поэтому выполнять их должны вы.Строка ещё не должна была использоваться. Подробности см. в описании
PyUnicode_New().Добавлено в версии 3.3.
-
Py_UCS4 PyUnicode_ReadChar(PyObject *unicode, Py_ssize_t index) -
Часть стабильного ABI начиная с версии 3.7.
Прочитайте символ из строки. В отличие от
PyUnicode_READ_CHAR(), которая не выполняет проверку ошибок, эта функция проверяет, что unicode является объектом Unicode и индекс не выходит за границы.При успехе верните символ; при ошибке верните
-1и установите исключение.Добавлено в версии 3.3.
-
PyObject *PyUnicode_Substring(PyObject *unicode, Py_ssize_t start, Py_ssize_t end) -
Возвращаемое значение: новая ссылка.Часть стабильного ABI начиная с версии 3.7.
Верните подстроку объекта unicode от индекса символа start (включительно) до индекса символа end (не включительно). Отрицательные индексы не поддерживаются. При ошибке установите исключение и верните
NULL.Добавлено в версии 3.3.
-
Py_UCS4 *PyUnicode_AsUCS4(PyObject *unicode, Py_UCS4 *buffer, Py_ssize_t buflen, int copy_null) -
Часть стабильного ABI начиная с версии 3.7.
Скопируйте строку unicode в буфер UCS4, добавив нулевой символ, если установлен параметр copy_null. При ошибке возвращается
NULLи устанавливается исключение (в частности,SystemError, если buflen меньше длины unicode). При успехе возвращается buffer.Добавлено в версии 3.3.
-
Py_UCS4 *PyUnicode_AsUCS4Copy(PyObject *unicode) -
Часть стабильного ABI начиная с версии 3.7.
Копирует строку unicode в новый буфер UCS4, выделенный с помощью
PyMem_Malloc(). В случае сбоя возвращаетсяNULLи устанавливаетсяMemoryError. К возвращаемому буферу всегда добавляется дополнительная нулевая кодовая точка.Добавлено в версии 3.3.
Кодировка локали
Текущую кодировку локали можно использовать для декодирования текста из операционной системы.
-
PyObject *PyUnicode_DecodeLocaleAndSize(const char *str, Py_ssize_t length, const char *errors) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI начиная с версии 3.7.
Декодирует строку из UTF-8 на Android и VxWorks либо из текущей кодировки локали на других платформах. Поддерживаются обработчики ошибок
"strict"и"surrogateescape"(PEP 383). Если errors имеет значениеNULL, декодер использует обработчик ошибок"strict". str должна оканчиваться нулевым символом, но не может содержать встроенные нулевые символы.Используйте
PyUnicode_DecodeFSDefaultAndSize()для декодирования строки с использованием кодировки файловой системы и обработчика ошибок.Эта функция игнорирует режим UTF-8 Python.
См. также
Функцию
Py_DecodeLocale().Добавлено в версии 3.3.
Изменено в версии 3.7: Теперь функция также использует текущую кодировку локали для обработчика ошибок
surrogateescape, за исключением Android. Ранее дляsurrogateescapeиспользоваласьPy_DecodeLocale(), а дляstrict— текущая кодировка локали.
-
PyObject *PyUnicode_DecodeLocale(const char *str, const char *errors) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI начиная с версии 3.7.
Аналогична
PyUnicode_DecodeLocaleAndSize(), но вычисляет длину строки с помощьюstrlen().Добавлено в версии 3.3.
-
PyObject *PyUnicode_EncodeLocale(PyObject *unicode, const char *errors) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI начиная с версии 3.7.
Кодирует объект Unicode в UTF-8 на Android и VxWorks либо в текущую кодировку локали на других платформах. Поддерживаются обработчики ошибок
"strict"и"surrogateescape"(PEP 383). Если errors имеет значениеNULL, кодировщик использует обработчик ошибок"strict". Возвращает объектbytes. unicode не может содержать встроенные нулевые символы.Используйте
PyUnicode_EncodeFSDefault()для кодирования строки с использованием кодировки файловой системы и обработчика ошибок.Эта функция игнорирует режим UTF-8 Python.
См. также
Функцию
Py_EncodeLocale().Добавлено в версии 3.3.
Изменено в версии 3.7: Теперь функция также использует текущую кодировку локали для обработчика ошибок
surrogateescape, за исключением Android. Ранее дляsurrogateescapeиспользоваласьPy_EncodeLocale(), а дляstrict— текущая кодировка локали.
Кодировка файловой системы
Функции кодирования и декодирования с использованием кодировки файловой системы и обработчика ошибок (PEP 383 и PEP 529).
Для кодирования имён файлов в bytes при разборе аргументов следует использовать преобразователь "O&", передав PyUnicode_FSConverter() в качестве функции преобразования:
-
int PyUnicode_FSConverter(PyObject *obj, void *result) -
Часть стабильного ABI.
Преобразователь PyArg_Parse*: кодирует объекты
str— полученные напрямую или через интерфейсos.PathLike— вbytesс помощьюPyUnicode_EncodeFSDefault(); объектыbytesвозвращаются без изменений. result должен быть адресом переменной C типа PyObject* (или PyBytesObject*). В случае успеха переменной присваивается новая сильная ссылка на объект bytes, которую необходимо освободить, когда она больше не используется; функция возвращает ненулевое значение (Py_CLEANUP_SUPPORTED). Встроенные нулевые байты в результате не допускаются. В случае сбоя возвращается0и устанавливается исключение.Если obj имеет значение
NULL, функция освобождает сильную ссылку, сохранённую в переменной, на которую указывает result, и возвращает1.Добавлено в версии 3.1.
Изменено в версии 3.6: Поддерживает объекты, подобные путям.
Для декодирования имён файлов в str при разборе аргументов следует использовать преобразователь "O&", передав PyUnicode_FSDecoder() в качестве функции преобразования:
-
int PyUnicode_FSDecoder(PyObject *obj, void *result) -
Часть стабильного ABI.
Преобразователь PyArg_Parse*: декодирует объекты
bytes— полученные напрямую или косвенно через интерфейсos.PathLike— вstrс помощьюPyUnicode_DecodeFSDefaultAndSize(); объектыstrвозвращаются без изменений. result должен быть адресом переменной C типа PyObject* (или PyUnicodeObject*). В случае успеха переменной присваивается новая сильная ссылка на объект Unicode, которую необходимо освободить, когда она больше не используется; функция возвращает ненулевое значение (Py_CLEANUP_SUPPORTED). Встроенные нулевые символы в результате не допускаются. В случае сбоя возвращается0и устанавливается исключение.Если obj имеет значение
NULL, освободите сильную ссылку на объект, на который указывает result, и верните1.Добавлено в версии 3.2.
Изменено в версии 3.6: Поддерживает объекты, подобные путям.
-
PyObject *PyUnicode_DecodeFSDefaultAndSize(const char *str, Py_ssize_t size) -
Возвращаемое значение: новая ссылка.Часть стабильного ABI.
Декодирует строку с использованием кодировки файловой системы и обработчика ошибок.
Если необходимо декодировать строку с использованием текущей кодировки локали, используйте
PyUnicode_DecodeLocaleAndSize().См. также
Функцию
Py_DecodeLocale().Изменено в версии 3.6: Теперь используется обработчик ошибок файловой системы.
-
PyObject *PyUnicode_DecodeFSDefault(const char *str) -
Возвращаемое значение: новая ссылка.Часть стабильного ABI.
Декодирует строку с завершающим нулевым символом с использованием кодировки файловой системы и обработчика ошибок.
Если длина строки известна, используйте
PyUnicode_DecodeFSDefaultAndSize().Изменено в версии 3.6: Теперь используется обработчик ошибок файловой системы.
-
PyObject *PyUnicode_EncodeFSDefault(PyObject *unicode) -
Возвращаемое значение: новая ссылка.Часть стабильного ABI.
Кодирует объект Unicode с использованием кодировки файловой системы и обработчика ошибок и возвращает
bytes. Обратите внимание, что полученный объектbytesможет содержать нулевые байты.Если необходимо закодировать строку с использованием текущей кодировки локали, используйте
PyUnicode_EncodeLocale().См. также
Функцию
Py_EncodeLocale().Добавлено в версии 3.2.
Изменено в версии 3.6: Теперь используется обработчик ошибок файловой системы.
Поддержка wchar_t
Поддержка wchar_t для платформ, на которых она доступна:
-
PyObject *PyUnicode_FromWideChar(const wchar_t *wstr, Py_ssize_t size) -
Возвращаемое значение: новая ссылка.Часть стабильного ABI.
Создаёт объект Unicode из буфера
wchar_twstr заданного размера size. Если в качестве size передано-1, функция должна самостоятельно вычислить длину с помощьюwcslen(). В случае сбоя возвращаетNULL.
-
Py_ssize_t PyUnicode_AsWideChar(PyObject *unicode, wchar_t *wstr, Py_ssize_t size) -
Часть стабильного ABI.
Копирует содержимое объекта Unicode в буфер
wchar_twstr. Копируется не более size символовwchar_t(без учёта возможного завершающего нулевого символа). Возвращает количество скопированных символовwchar_tили-1в случае ошибки.Если wstr имеет значение
NULL, вместо этого возвращает size, необходимый для хранения всего объекта unicode, включая завершающий нулевой символ.Обратите внимание, что результирующая строка wchar_t* может быть завершена нулевым символом, а может и не быть. Если приложению требуется завершающий нулевой символ, вызывающая сторона должна убедиться, что строка wchar_t* им завершается. Кроме того, строка wchar_t* может содержать нулевые символы, из-за которых при использовании с большинством функций C строка будет усечена.
-
wchar_t *PyUnicode_AsWideCharString(PyObject *unicode, Py_ssize_t *size) -
Часть стабильного ABI начиная с версии 3.7.
Преобразует объект Unicode в широкосимвольную строку. Выходная строка всегда заканчивается нулевым символом. Если size не имеет значения
NULL, количество широких символов (без учёта завершающего нулевого символа) записывается в *size. Обратите внимание, что результирующая строкаwchar_tможет содержать нулевые символы, из-за которых при использовании с большинством функций C строка будет усечена. Если size имеет значениеNULL, а строка wchar_t* содержит нулевые символы, возбуждается исключениеValueError.В случае успеха возвращает буфер, выделенный с помощью
PyMem_New(для освобождения используйтеPyMem_Free()). В случае ошибки возвращаетNULL, а значение *size не определено. Если выделить память не удалось, возбуждается исключениеMemoryError.Добавлено в версии 3.2.
Изменено в версии 3.7: Если size имеет значение
NULL, а строка wchar_t* содержит нулевые символы, возбуждается исключениеValueError.
Встроенные кодеки
Python предоставляет набор встроенных кодеков, написанных на C для повышения скорости. Все эти кодеки можно напрямую использовать с помощью следующих функций.
Многие из следующих API принимают два аргумента: encoding и errors; их семантика совпадает с семантикой аргументов с такими же именами у встроенного конструктора строкового объекта str().
Если для encoding задано значение NULL, используется кодировка по умолчанию — UTF-8. Для работы с файловой системой следует использовать PyUnicode_FSConverter() для кодирования имён файлов. Эта функция внутри использует кодировку файловой системы и обработчик ошибок.
Обработка ошибок задаётся аргументом errors, которому также можно присвоить значение NULL, чтобы использовать обработку по умолчанию, определённую для кодека. Обработка ошибок по умолчанию для всех встроенных кодеков — «strict» (вызывается исключение ValueError).
Все кодеки используют схожий интерфейс. Для простоты документированы только отклонения от следующих общих вариантов.
Общие кодеки
Предоставляется следующий макрос:
-
Py_UNICODE_REPLACEMENT_CHARACTER -
Кодовая точка Unicode
U+FFFD(символ замены).Этот символ Unicode используется в качестве символа замены при декодировании, если аргумент errors имеет значение «replace».
Общие API кодеков:
-
PyObject *PyUnicode_Decode(const char *str, Py_ssize_t size, const char *encoding, const char *errors) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Создаёт объект Unicode, декодируя size байт закодированной строки str. Аргументы encoding и errors имеют тот же смысл, что и одноимённые параметры встроенной функции
str(). Используемый кодек ищется в реестре кодеков Python. ВозвращаетNULL, если кодек вызвал исключение.
-
PyObject *PyUnicode_AsEncodedString(PyObject *unicode, const char *encoding, const char *errors) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Кодирует объект Unicode и возвращает результат в виде байтового объекта Python. Аргументы encoding и errors имеют тот же смысл, что и одноимённые параметры метода
encode()объекта Unicode. Используемый кодек ищется в реестре кодеков Python. ВозвращаетNULL, если кодек вызвал исключение.
Кодеки UTF-8
API кодеков UTF-8:
-
PyObject *PyUnicode_DecodeUTF8(const char *str, Py_ssize_t size, const char *errors) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Создаёт объект Unicode, декодируя size байт строки str, закодированной в UTF-8. Возвращает
NULL, если кодек вызвал исключение.
-
PyObject *PyUnicode_DecodeUTF8Stateful(const char *str, Py_ssize_t size, const char *errors, Py_ssize_t *consumed) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Если consumed имеет значение
NULL, функция работает так же, какPyUnicode_DecodeUTF8(). Если consumed не имеет значениеNULL, завершающие неполные последовательности байтов UTF-8 не считаются ошибкой. Эти байты не декодируются, а количество декодированных байтов сохраняется в consumed.
-
PyObject *PyUnicode_AsUTF8String(PyObject *unicode) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Кодирует объект Unicode с помощью UTF-8 и возвращает результат в виде байтового объекта Python. Обработка ошибок — «strict». Возвращает
NULL, если кодек вызвал исключение.Функция завершается с ошибкой, если строка содержит суррогатные кодовые точки (
U+D800-U+DFFF).
-
const char *PyUnicode_AsUTF8AndSize(PyObject *unicode, Py_ssize_t *size) -
Часть стабильного ABI начиная с версии 3.10.
Возвращает указатель на представление объекта Unicode в кодировке UTF-8 и сохраняет размер закодированного представления (в байтах) в size. Аргумент size может иметь значение
NULL; в этом случае размер не сохраняется. В конец возвращаемого буфера всегда добавляется дополнительный нулевой байт (не включённый в size), независимо от наличия других нулевых кодовых точек.В случае ошибки задаёт исключение, устанавливает для size значение
-1(если он не равен NULL) и возвращаетNULL.Функция завершается с ошибкой, если строка содержит суррогатные кодовые точки (
U+D800-U+DFFF).Представление строки в UTF-8 кэшируется в объекте Unicode, и последующие вызовы возвращают указатель на тот же буфер. Вызывающая сторона не должна освобождать буфер. Буфер освобождается, а указатели на него становятся недействительными при сборке мусора для объекта Unicode.
Добавлено в версии 3.3.
Изменено в версии 3.7: Теперь тип возвращаемого значения —
const char *, а неchar *.Изменено в версии 3.10: Эта функция входит в состав ограниченного API.
-
const char *PyUnicode_AsUTF8(PyObject *unicode) -
Аналогична
PyUnicode_AsUTF8AndSize(), но не сохраняет размер.Предупреждение
Эта функция не обрабатывает особым образом нулевые символы, встроенные в unicode. Поэтому строки, содержащие нулевые символы, сохраняются в возвращаемой строке; некоторые функции C могут интерпретировать их как конец строки, что приведёт к усечению. Если усечение может стать проблемой, рекомендуется использовать вместо неё
PyUnicode_AsUTF8AndSize().Добавлено в версии 3.3.
Изменено в версии 3.7: Теперь тип возвращаемого значения —
const char *, а неchar *.
Кодеки UTF-32
API кодеков UTF-32:
-
PyObject *PyUnicode_DecodeUTF32(const char *str, Py_ssize_t size, const char *errors, int *byteorder) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Декодирует size байт из строки буфера, закодированной в UTF-32, и возвращает соответствующий объект 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, любая метка порядка байтов копируется в выходные данные.После завершения работы *byteorder устанавливается в соответствии с текущим порядком байтов в конце входных данных.
Если byteorder равен
NULL, кодек начинает работу в режиме собственного порядка байтов.Возвращает
NULL, если кодек вызвал исключение.
-
PyObject *PyUnicode_DecodeUTF32Stateful(const char *str, Py_ssize_t size, const char *errors, int *byteorder, Py_ssize_t *consumed) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Если consumed имеет значение
NULL, функция работает так же, какPyUnicode_DecodeUTF32(). Если consumed не имеет значенияNULL,PyUnicode_DecodeUTF32Stateful()не считает завершающие неполные последовательности байтов UTF-32 (например, количество байтов, не делящееся на четыре) ошибкой. Эти байты не декодируются, а количество декодированных байтов сохраняется в consumed.
-
PyObject *PyUnicode_AsUTF32String(PyObject *unicode) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Возвращает байтовую строку Python в кодировке UTF-32 с собственным порядком байтов. Строка всегда начинается с метки BOM. Обработка ошибок — «strict». Возвращает
NULL, если кодек вызвал исключение.
Кодеки UTF-16
API кодеков UTF-16:
-
PyObject *PyUnicode_DecodeUTF16(const char *str, Py_ssize_t size, const char *errors, int *byteorder) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Декодирует 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 *str, Py_ssize_t size, const char *errors, int *byteorder, Py_ssize_t *consumed) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Если consumed имеет значение
NULL, функция работает так же, какPyUnicode_DecodeUTF16(). Если consumed не имеет значенияNULL,PyUnicode_DecodeUTF16Stateful()не считает завершающие неполные последовательности байтов UTF-16 (например, нечётное количество байтов или разделённую суррогатную пару) ошибкой. Эти байты не декодируются, а количество декодированных байтов сохраняется в consumed.
-
PyObject *PyUnicode_AsUTF16String(PyObject *unicode) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Возвращает байтовую строку Python в кодировке UTF-16 с собственным порядком байтов. Строка всегда начинается с метки BOM. Обработка ошибок — «strict». Возвращает
NULL, если кодек вызвал исключение.
Кодеки UTF-7
API кодеков UTF-7:
-
PyObject *PyUnicode_DecodeUTF7(const char *str, Py_ssize_t size, const char *errors) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Создаёт объект Unicode, декодируя size байт строки str, закодированной в UTF-7. Возвращает
NULL, если кодек вызвал исключение.
-
PyObject *PyUnicode_DecodeUTF7Stateful(const char *str, Py_ssize_t size, const char *errors, Py_ssize_t *consumed) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Если consumed имеет значение
NULL, функция работает так же, какPyUnicode_DecodeUTF7(). Если consumed не имеет значенияNULL, завершающие неполные участки base-64 в UTF-7 не считаются ошибкой. Эти байты не декодируются, а количество декодированных байтов сохраняется в consumed.
Кодеки Unicode-Escape
API кодека «Unicode Escape»:
-
PyObject *PyUnicode_DecodeUnicodeEscape(const char *str, Py_ssize_t size, const char *errors) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Создаёт объект Unicode, декодируя size байт строки str, закодированной в Unicode-Escape. Возвращает
NULL, если кодек вызвал исключение.
-
PyObject *PyUnicode_AsUnicodeEscapeString(PyObject *unicode) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Кодирует объект Unicode с помощью Unicode-Escape и возвращает результат в виде байтового объекта. Обработка ошибок — «strict». Возвращает
NULL, если кодек вызвал исключение.
Кодеки Raw-Unicode-Escape
API кодека «Raw Unicode Escape»:
-
PyObject *PyUnicode_DecodeRawUnicodeEscape(const char *str, Py_ssize_t size, const char *errors) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Создаёт объект Unicode, декодируя size байт строки str, закодированной в Raw-Unicode-Escape. Возвращает
NULL, если кодек вызвал исключение.
-
PyObject *PyUnicode_AsRawUnicodeEscapeString(PyObject *unicode) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Кодирует объект Unicode с помощью Raw-Unicode-Escape и возвращает результат в виде байтового объекта. Обработка ошибок — «strict». Возвращает
NULL, если кодек вызвал исключение.
Кодеки Latin-1
API кодеков Latin-1: Latin-1 соответствует первым 256 порядковым номерам Unicode, и при кодировании кодеки принимают только их.
-
PyObject *PyUnicode_DecodeLatin1(const char *str, Py_ssize_t size, const char *errors) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Создаёт объект Unicode, декодируя size байт строки str, закодированной в Latin-1. Возвращает
NULL, если кодек вызвал исключение.
-
PyObject *PyUnicode_AsLatin1String(PyObject *unicode) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Кодирует объект Unicode с помощью Latin-1 и возвращает результат в виде байтового объекта Python. Обработка ошибок — «strict». Возвращает
NULL, если кодек вызвал исключение.
Кодеки ASCII
API кодеков ASCII. Принимаются только 7-битные данные ASCII. Все остальные коды вызывают ошибки.
-
PyObject *PyUnicode_DecodeASCII(const char *str, Py_ssize_t size, const char *errors) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Создаёт объект Unicode, декодируя size байт строки str, закодированной в ASCII. Возвращает
NULL, если кодек вызвал исключение.
-
PyObject *PyUnicode_AsASCIIString(PyObject *unicode) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Кодирует объект Unicode с помощью ASCII и возвращает результат в виде байтового объекта Python. Обработка ошибок — «strict». Возвращает
NULL, если кодек вызвал исключение.
Кодеки таблицы символов
Этот кодек особенный: его можно использовать для реализации множества различных кодеков (так и были получены большинство стандартных кодеков, включённых в пакет encodings). Для кодирования и декодирования символов кодек использует таблицы соответствий. Предоставляемые объекты таблиц должны поддерживать интерфейс отображения __getitem__(); хорошо подходят словари и последовательности.
API кодеков с таблицами соответствий:
-
PyObject *PyUnicode_DecodeCharmap(const char *str, Py_ssize_t length, PyObject *mapping, const char *errors) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Создаёт объект Unicode, декодируя size байт закодированной строки str с помощью заданного объекта mapping. Возвращает
NULL, если кодек вызвал исключение.Если mapping равен
NULL, применяется декодирование Latin-1. В противном случае mapping должен сопоставлять порядковые номера байтов (целые числа в диапазоне от 0 до 255) строкам Unicode, целым числам (которые затем интерпретируются как порядковые номера Unicode) илиNone. Несопоставленные байты данных — те, которые вызываютLookupError, а также те, которым сопоставлено значениеNone,0xFFFEили'\ufffe', — считаются неопределёнными сопоставлениями и вызывают ошибку.
-
PyObject *PyUnicode_AsCharmapString(PyObject *unicode, PyObject *mapping) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Кодирует объект Unicode с помощью заданного объекта mapping и возвращает результат в виде байтового объекта. Обработка ошибок — «strict». Возвращает
NULL, если кодек вызвал исключение.Объект mapping должен сопоставлять целые числа — порядковые номера Unicode — байтовым объектам, целым числам в диапазоне от 0 до 255 или
None. Несопоставленные порядковые номера символов (те, которые вызываютLookupError), а также символы, которым сопоставлено значениеNone, считаются «неопределённым сопоставлением» и вызывают ошибку.
Следующий API кодека является особенным, так как сопоставляет Unicode с Unicode.
-
PyObject *PyUnicode_Translate(PyObject *unicode, PyObject *table, const char *errors) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Преобразует строку, применяя к ней таблицу сопоставления символов, и возвращает полученный объект Unicode. Возвращает
NULL, если кодек вызвал исключение.Таблица сопоставления должна сопоставлять целые числа — порядковые номера Unicode — целым числам — порядковым номерам Unicode — или
None(что приводит к удалению символа).Таблицам сопоставления достаточно предоставлять интерфейс
__getitem__(); хорошо подходят словари и последовательности. Несопоставленные порядковые номера символов (те, которые вызываютLookupError) остаются без изменений и копируются как есть.errors имеет обычный для кодеков смысл. Ему можно присвоить значение
NULL, чтобы использовать обработку ошибок по умолчанию.
Кодеки MBCS для Windows
API кодеков MBCS. В настоящее время они доступны только в Windows и используют преобразователи Win32 MBCS для выполнения преобразований. Обратите внимание, что MBCS (или DBCS) — это класс кодировок, а не одна конкретная кодировка. Целевая кодировка определяется пользовательскими настройками компьютера, на котором работает кодек.
-
PyObject *PyUnicode_DecodeMBCS(const char *str, Py_ssize_t size, const char *errors) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI в Windows начиная с версии 3.7.
Создаёт объект Unicode, декодируя size байт строки str, закодированной в MBCS. Возвращает
NULL, если кодек вызвал исключение.
-
PyObject *PyUnicode_DecodeMBCSStateful(const char *str, Py_ssize_t size, const char *errors, Py_ssize_t *consumed) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI в Windows начиная с версии 3.7.
Если consumed имеет значение
NULL, функция работает так же, какPyUnicode_DecodeMBCS(). Если consumed не имеет значенияNULL,PyUnicode_DecodeMBCSStateful()не декодирует завершающий ведущий байт, а количество декодированных байтов сохраняет в consumed.
-
PyObject *PyUnicode_DecodeCodePageStateful(int code_page, const char *str, Py_ssize_t size, const char *errors, Py_ssize_t *consumed) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI в Windows начиная с версии 3.7.
Аналогична
PyUnicode_DecodeMBCSStateful(), но использует кодовую страницу, заданную аргументом code_page.
-
PyObject *PyUnicode_AsMBCSString(PyObject *unicode) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI в Windows начиная с версии 3.7.
Кодирует объект Unicode с помощью MBCS и возвращает результат в виде байтового объекта Python. Обработка ошибок — «strict». Возвращает
NULL, если кодек вызвал исключение.
-
PyObject *PyUnicode_EncodeCodePage(int code_page, PyObject *unicode, const char *errors) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI в Windows начиная с версии 3.7.
Кодирует объект Unicode с помощью указанной кодовой страницы и возвращает байтовый объект Python. Возвращает
NULL, если кодек вызвал исключение. Чтобы получить кодировщик MBCS, используйте кодовую страницуCP_ACP.Добавлено в версии 3.3.
Методы и слотовые функции
Следующие API могут принимать на вход объекты и строки Unicode (в описаниях мы называем их строками) и возвращать объекты Unicode или целые числа в зависимости от ситуации.
При возникновении исключения все они возвращают NULL или -1.
-
PyObject *PyUnicode_Concat(PyObject *left, PyObject *right) -
Возвращаемое значение: новая ссылка. Входит в стабильный ABI.
Объединяет две строки, создавая новую строку Unicode.
-
PyObject *PyUnicode_Split(PyObject *unicode, PyObject *sep, Py_ssize_t maxsplit) -
Возвращаемое значение: новая ссылка. Входит в стабильный ABI.
Разбивает строку и возвращает список строк Unicode. Если sep равен
NULL, разделение выполняется по всем подстрокам из пробельных символов. В противном случае разделение выполняется по указанному разделителю. Выполняется не более maxsplit разделений. Если значение отрицательное, ограничений нет. Разделители не включаются в результирующий список.При ошибке возвращает
NULLс установленным исключением.Эквивалентно
str.split().
-
PyObject *PyUnicode_RSplit(PyObject *unicode, PyObject *sep, Py_ssize_t maxsplit) -
Возвращаемое значение: новая ссылка. Входит в стабильный ABI.
Аналогично
PyUnicode_Split(), но разделение выполняется с конца строки.При ошибке возвращает
NULLс установленным исключением.Эквивалентно
str.rsplit().
-
PyObject *PyUnicode_Splitlines(PyObject *unicode, int keepends) -
Возвращаемое значение: новая ссылка. Входит в стабильный ABI.
Разбивает строку Unicode по символам перевода строки и возвращает список строк Unicode. CRLF считается одним символом перевода строки. Если keepends равен
0, символы перевода строки не включаются в результирующие строки.
-
PyObject *PyUnicode_Partition(PyObject *unicode, PyObject *sep) -
Возвращаемое значение: новая ссылка. Входит в стабильный ABI.
Разбивает строку Unicode по первому вхождению sep и возвращает 3-элементный кортеж, содержащий часть перед разделителем, сам разделитель и часть после него. Если разделитель не найден, возвращает 3-элементный кортеж, содержащий саму строку, за которой следуют две пустые строки.
sep не должен быть пустым.
При ошибке возвращает
NULLс установленным исключением.Эквивалентно
str.partition().
-
PyObject *PyUnicode_RPartition(PyObject *unicode, PyObject *sep) -
Возвращаемое значение: новая ссылка. Входит в стабильный ABI.
Аналогично
PyUnicode_Partition(), но разбивает строку Unicode по последнему вхождению sep. Если разделитель не найден, возвращает 3-элементный кортеж, содержащий две пустые строки, за которыми следует сама строка.sep не должен быть пустым.
При ошибке возвращает
NULLс установленным исключением.Эквивалентно
str.rpartition().
-
PyObject *PyUnicode_Join(PyObject *separator, PyObject *seq) -
Возвращаемое значение: новая ссылка. Входит в стабильный ABI.
Объединяет последовательность строк с помощью указанного separator и возвращает результирующую строку Unicode.
-
Py_ssize_t PyUnicode_Tailmatch(PyObject *unicode, PyObject *substr, Py_ssize_t start, Py_ssize_t end, int direction) -
Входит в стабильный ABI.
Возвращает
1, если substr соответствуетunicode[start:end]в указанном конце строки (direction ==-1означает проверку префикса, direction ==1— суффикса), и0в противном случае. Возвращает-1при возникновении ошибки.
-
Py_ssize_t PyUnicode_Find(PyObject *unicode, PyObject *substr, Py_ssize_t start, Py_ssize_t end, int direction) -
Входит в стабильный ABI.
Возвращает первую позицию substr в
unicode[start:end], используя указанное направление direction (direction ==1означает прямой поиск, direction ==-1— обратный поиск). Возвращаемое значение — индекс первого совпадения; значение-1означает, что совпадений не найдено, а-2— что произошла ошибка и было установлено исключение.
-
Py_ssize_t PyUnicode_FindChar(PyObject *unicode, Py_UCS4 ch, Py_ssize_t start, Py_ssize_t end, int direction) -
Входит в стабильный ABI начиная с версии 3.7.
Возвращает первую позицию символа ch в
unicode[start:end], используя указанное направление direction (direction ==1означает прямой поиск, direction ==-1— обратный поиск). Возвращаемое значение — индекс первого совпадения; значение-1означает, что совпадений не найдено, а-2— что произошла ошибка и было установлено исключение.Добавлено в версии 3.3.
Изменено в версии 3.7: значения start и end теперь корректируются так же, как в
unicode[start:end].
-
Py_ssize_t PyUnicode_Count(PyObject *unicode, PyObject *substr, Py_ssize_t start, Py_ssize_t end) -
Входит в стабильный ABI.
Возвращает количество неперекрывающихся вхождений substr в
unicode[start:end]. Возвращает-1при возникновении ошибки.
-
PyObject *PyUnicode_Replace(PyObject *unicode, PyObject *substr, PyObject *replstr, Py_ssize_t maxcount) -
Возвращаемое значение: новая ссылка. Входит в стабильный ABI.
Заменяет не более maxcount вхождений substr в unicode на replstr и возвращает результирующий объект Unicode. Значение maxcount ==
-1означает, что заменяются все вхождения.
-
int PyUnicode_Compare(PyObject *left, PyObject *right) -
Входит в стабильный ABI.
Сравнивает две строки и возвращает
-1,0,1для случаев «меньше», «равно» и «больше» соответственно.При сбое эта функция возвращает
-1, поэтому для проверки наличия ошибок следует вызватьPyErr_Occurred().См. также
Функцию
PyUnicode_Equal().
-
int PyUnicode_Equal(PyObject *a, PyObject *b) -
Входит в стабильный ABI начиная с версии 3.14.
Проверяет, равны ли две строки:
- Возвращает
1, если a равно b. - Возвращает
0, если a не равно b. - Устанавливает исключение
TypeErrorи возвращает-1, если a или b не является объектомstr.
Функция всегда выполняется успешно, если a и b являются объектами
str.Функция работает с подклассами
str, но не учитывает пользовательский метод__eq__().См. также
Функцию
PyUnicode_Compare().Добавлено в версии 3.14.
- Возвращает
-
int PyUnicode_EqualToUTF8AndSize(PyObject *unicode, const char *string, Py_ssize_t size) -
Входит в стабильный ABI начиная с версии 3.13.
Сравнивает объект Unicode с буфером char, который интерпретируется как строка в кодировке UTF-8 или ASCII, и возвращает true (
1), если они равны, или false (0) в противном случае. Если объект Unicode содержит суррогатные кодовые точки (U+D800-U+DFFF) или строка C не является корректной строкой UTF-8, возвращается false (0).Эта функция не вызывает исключений.
Добавлено в версии 3.13.
-
int PyUnicode_EqualToUTF8(PyObject *unicode, const char *string) -
Входит в стабильный ABI начиная с версии 3.13.
Аналогично
PyUnicode_EqualToUTF8AndSize(), но длина string вычисляется с помощьюstrlen(). Если объект Unicode содержит нулевые символы, возвращается false (0).Добавлено в версии 3.13.
-
int PyUnicode_CompareWithASCIIString(PyObject *unicode, const char *string) -
Входит в стабильный ABI.
Сравнивает объект Unicode unicode со строкой string и возвращает
-1,0,1для случаев «меньше», «равно» и «больше» соответственно. Рекомендуется передавать только строки в кодировке ASCII, но если входная строка содержит символы, не входящие в ASCII, функция интерпретирует её как строку в кодировке ISO-8859-1.Эта функция не вызывает исключений.
-
PyObject *PyUnicode_RichCompare(PyObject *left, PyObject *right, int op) -
Возвращаемое значение: новая ссылка. Входит в стабильный ABI.
Выполняет расширенное сравнение двух строк Unicode и возвращает одно из следующих значений:
-
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) -
Возвращаемое значение: новая ссылка. Входит в стабильный ABI.
Возвращает новый строковый объект на основе format и args; аналогично
format % args.
-
int PyUnicode_Contains(PyObject *unicode, PyObject *substr) -
Входит в стабильный ABI.
Проверяет, содержится ли substr в unicode, и возвращает true или false соответственно.
substr должен приводиться к строке Unicode из одного элемента. Если произошла ошибка, возвращается
-1.
-
void PyUnicode_InternInPlace(PyObject **p_unicode) -
Входит в стабильный ABI.
Интернирует на месте аргумент *p_unicode. Аргумент должен быть адресом переменной-указателя, указывающей на объект строки Unicode Python. Если уже существует такая же интернированная строка, как *p_unicode, эта переменная получает указатель на неё (ссылку на старый строковый объект освобождают, а на интернированный объект строки создают новую сильную ссылку); в противном случае значение *p_unicode не меняется, а строка интернируется.
(Пояснение: хотя здесь много говорится о ссылках, считайте, что эта функция не меняет владение ссылками. Передаваемый объект должен принадлежать вам; после вызова переданная ссылка больше вам не принадлежит, но вам начинает принадлежать результат.)
Эта функция никогда не вызывает исключений. При ошибке она оставляет аргумент без изменений и не интернирует его.
Экземпляры подклассов
strмогут не интернироваться, то есть выражение PyUnicode_CheckExact(*p_unicode) должно быть истинным. Если это не так, аргумент, как и при любой другой ошибке, остаётся без изменений.Обратите внимание: интернированные строки не являются «бессмертными». Чтобы воспользоваться преимуществами интернирования, необходимо хранить ссылку на результат.
-
PyObject *PyUnicode_InternFromString(const char *str) -
Возвращаемое значение: новая ссылка. Входит в стабильный ABI.
Комбинация
PyUnicode_FromString()иPyUnicode_InternInPlace(), предназначенная для статически выделенных строк.Возвращает новую («принадлежащую вызывающему коду») ссылку либо на новый интернированный объект строки Unicode, либо на ранее интернированный объект строки с таким же значением.
Python может хранить ссылку на результат или сделать его бессмертным, из-за чего он не будет сразу удалён сборщиком мусора. Для интернирования неограниченного количества различных строк, например полученных от пользователя, предпочтительнее напрямую вызывать
PyUnicode_FromString()иPyUnicode_InternInPlace().
-
unsigned int PyUnicode_CHECK_INTERNED(PyObject *str) -
Возвращает ненулевое значение, если str интернирована, и ноль в противном случае. Аргумент str должен быть строкой; это не проверяется. Эта функция всегда выполняется успешно.
Деталь реализации CPython: Ненулевое возвращаемое значение может содержать дополнительную информацию о том, как интернирована строка. Значение таких ненулевых значений, а также подробности, связанные с интернированием каждой конкретной строки, могут меняться между версиями CPython.
PyUnicodeWriter
API PyUnicodeWriter можно использовать для создания объекта str Python.
Добавлено в версии 3.14.
-
type PyUnicodeWriter -
Экземпляр средства записи Unicode.
При успешном выполнении экземпляр необходимо уничтожить с помощью
PyUnicodeWriter_Finish(), а при ошибке — с помощьюPyUnicodeWriter_Discard().
-
PyUnicodeWriter *PyUnicodeWriter_Create(Py_ssize_t length) -
Создаёт экземпляр средства записи Unicode.
length должно быть больше или равно
0.Если length больше
0, предварительно выделяется внутренний буфер размером length символов.При ошибке устанавливает исключение и возвращает
NULL.
-
PyObject *PyUnicodeWriter_Finish(PyUnicodeWriter *writer) -
Возвращает итоговый объект
strPython и уничтожает экземпляр средства записи.При ошибке устанавливает исключение и возвращает
NULL.После этого вызова экземпляр средства записи становится недействительным.
-
void PyUnicodeWriter_Discard(PyUnicodeWriter *writer) -
Отбрасывает внутренний буфер Unicode и уничтожает экземпляр средства записи.
Если writer равен
NULL, операция не выполняется.После этого вызова экземпляр средства записи становится недействительным.
-
int PyUnicodeWriter_WriteChar(PyUnicodeWriter *writer, Py_UCS4 ch) -
Записывает одиночный символ Unicode ch в writer.
При успехе возвращает
0. При ошибке устанавливает исключение, оставляет средство записи без изменений и возвращает-1.
-
int PyUnicodeWriter_WriteUTF8(PyUnicodeWriter *writer, const char *str, Py_ssize_t size) -
Декодирует строку str из UTF-8 в строгом режиме и записывает результат в writer.
size — длина строки в байтах. Если size равен
-1, для определения длины строки вызываетсяstrlen(str).При успехе возвращает
0. При ошибке устанавливает исключение, оставляет средство записи без изменений и возвращает-1.См. также
PyUnicodeWriter_DecodeUTF8Stateful().
-
int PyUnicodeWriter_WriteASCII(PyUnicodeWriter *writer, const char *str, Py_ssize_t size) -
Записывает строку ASCII str в writer.
size — длина строки в байтах. Если size равен
-1, для определения длины строки вызываетсяstrlen(str).str должна содержать только символы ASCII. Поведение не определено, если str содержит символы, не входящие в ASCII.
При успехе возвращает
0. При ошибке устанавливает исключение, оставляет средство записи без изменений и возвращает-1.
-
int PyUnicodeWriter_WriteWideChar(PyUnicodeWriter *writer, const wchar_t *str, Py_ssize_t size) -
Записывает широкую строку str в writer.
size — количество широких символов. Если size равен
-1, для определения длины строки вызываетсяwcslen(str).При успехе возвращает
0. При ошибке устанавливает исключение, оставляет средство записи без изменений и возвращает-1.
-
int PyUnicodeWriter_WriteUCS4(PyUnicodeWriter *writer, Py_UCS4 *str, Py_ssize_t size) -
Записывает строку UCS4 str в writer.
size — количество символов UCS4.
При успехе возвращает
0. При ошибке устанавливает исключение, оставляет средство записи без изменений и возвращает-1.
-
int PyUnicodeWriter_WriteStr(PyUnicodeWriter *writer, PyObject *obj) -
Вызывает
PyObject_Str()для obj и записывает результат в writer.При успехе возвращает
0. При ошибке устанавливает исключение, оставляет средство записи без изменений и возвращает-1.Чтобы записать подкласс
str, переопределяющий метод__str__(), можно использоватьPyUnicode_FromObject(), чтобы получить исходную строку.
-
int PyUnicodeWriter_WriteRepr(PyUnicodeWriter *writer, PyObject *obj) -
Вызывает
PyObject_Repr()для obj и записывает результат в writer.Если obj равен
NULL, записывает строку"<NULL>"в writer.При успехе возвращает
0. При ошибке устанавливает исключение, оставляет средство записи без изменений и возвращает-1.Изменено в версии 3.14.4: добавлена поддержка
NULL.
-
int PyUnicodeWriter_WriteSubstring(PyUnicodeWriter *writer, PyObject *str, Py_ssize_t start, Py_ssize_t end) -
Записывает подстроку
str[start:end]в writer.str должен быть объектом
strPython. Значение start должно быть больше или равно 0 и меньше или равно end. Значение end должно быть меньше или равно длине str.При успехе возвращает
0. При ошибке устанавливает исключение, оставляет средство записи без изменений и возвращает-1.
-
int PyUnicodeWriter_Format(PyUnicodeWriter *writer, const char *format, ...) -
Аналогично
PyUnicode_FromFormat(), но записывает результат непосредственно в writer.При успехе возвращает
0. При ошибке устанавливает исключение, оставляет средство записи без изменений и возвращает-1.
-
int PyUnicodeWriter_DecodeUTF8Stateful(PyUnicodeWriter *writer, const char *string, Py_ssize_t length, const char *errors, Py_ssize_t *consumed) -
Декодирует строку str из UTF-8 с обработчиком ошибок errors и записывает результат в writer.
size — длина строки в байтах. Если size равен
-1, для определения длины строки вызываетсяstrlen(str).errors — имя обработчика ошибок, например
"replace". Если errors равенNULL, используется строгий обработчик ошибок.Если consumed не равен
NULL, при успешном выполнении в *consumed записывается количество декодированных байтов. Если consumed равенNULL, неполные последовательности байтов UTF-8 в конце считаются ошибкой.При успехе возвращает
0. При ошибке устанавливает исключение, оставляет средство записи без изменений и возвращает-1.См. также
PyUnicodeWriter_WriteUTF8().
Устаревший API
Следующий API является устаревшим.
-
type Py_UNICODE -
Это псевдоним типа для
wchar_t, который в зависимости от платформы является 16-битным или 32-битным типом. Вместо него используйте непосредственноwchar_t.Изменено в версии 3.3: в предыдущих версиях это был 16-битный или 32-битный тип в зависимости от того, какую версию Python с «узким» или «широким» Unicode вы выбрали при сборке.
Устарел начиная с версии 3.13, будет удалён в версии 3.15.
-
int PyUnicode_READY(PyObject *unicode) -
Ничего не делает и возвращает
0. Этот API сохранён только для обратной совместимости; планов по его удалению нет.Добавлено в версии 3.3.
Устарел начиная с версии 3.10: этот API ничего не делает начиная с Python 3.12. Ранее его требовалось вызывать для каждой строки, созданной с помощью старого API (
PyUnicode_FromUnicode()или аналогичного).
-
unsigned int PyUnicode_IS_READY(PyObject *unicode) -
Ничего не делает и возвращает
1. Этот API сохранён только для обратной совместимости; планов по его удалению нет.Добавлено в версии 3.3.
Устарел начиная с версии 3.14: этот API ничего не делает начиная с Python 3.12. Ранее его можно было вызывать, чтобы проверить, требуется ли
PyUnicode_READY().
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/c-api/unicode.html