Unicode对象和编解码器

Unicode对象

自实施以来 PEP 393 在python 3.3中,unicode对象在内部使用各种表示,以便在保持内存效率的同时处理完整的unicode字符范围。对于所有代码点都低于128、256或65536的字符串,有一些特殊情况;否则,代码点必须低于1114112(即完整的Unicode范围)。

Py_UNICODE* UTF-8表示是按需创建的,并缓存在Unicode对象中。这个 Py_UNICODE* 不推荐使用表示法,而且效率低下;在性能或内存敏感的情况下应该避免使用表示法。

由于旧API和新API之间的转换,Unicode对象可以在内部处于两种状态,这取决于它们是如何创建的:

  • “canonical”unicode对象是由不推荐使用的unicode api创建的所有对象。它们使用实现所允许的最有效的表示。

  • “传统”Unicode对象是通过一个不推荐使用的API创建的(通常 PyUnicode_FromUnicode() )只承受 Py_UNICODE* 代表;你必须打电话 PyUnicode_READY() 在调用任何其他API之前。

注解

python3.12中的“遗留”Unicode对象将与不推荐的api一起删除。从那时起,所有Unicode对象都将是“规范的”。看到了吗 PEP 623 更多信息。

Unicode类型

以下是在Python中用于Unicode实现的基本Unicode对象类型:

type Py_UCS4
type Py_UCS2
type Py_UCS1

这些类型是无符号整数类型的typedef,其宽度足以分别包含32位、16位和8位的字符。处理单个Unicode字符时,请使用 Py_UCS4 .

3.3 新版功能.

type Py_UNICODE

这是typedef wchar_t ,它是16位类型或32位类型,具体取决于平台。

在 3.3 版更改: 在以前的版本中,这是一个16位类型或32位类型,这取决于您在构建时选择的是“窄”还是“宽”Unicode版本的Python。

type PyASCIIObject
type PyCompactUnicodeObject
type PyUnicodeObject

这些子类型 PyObject 表示一个python unicode对象。在几乎所有情况下,都不应该直接使用它们,因为处理Unicode对象的所有API函数都接受并返回 PyObject 指针。

3.3 新版功能.

PyTypeObject PyUnicode_Type

此实例 PyTypeObject 表示python unicode类型。它向python代码公开为 str .

以下API实际上是C宏,可用于快速检查和访问Unicode对象的内部只读数据:

int PyUnicode_Check(PyObject *o)

如果对象的值为True,则返回TRUE o 是Unicode对象或Unicode子类型的实例。此功能总是成功的。

int PyUnicode_CheckExact(PyObject *o)

如果对象的值为True,则返回TRUE o 是Unicode对象,但不是子类型的实例。此功能总是成功的。

int PyUnicode_READY(PyObject *o)

确保字符串对象 o 在“规范”表示中。在使用下面描述的任何访问宏之前,都需要这样做。

返回 0 论成功与否 -1 在失败时设置一个异常,特别是当内存分配失败时。

3.3 新版功能.

Deprecated since version 3.10, will be removed in version 3.12: 此API将使用 PyUnicode_FromUnicode() .

Py_ssize_t PyUnicode_GET_LENGTH(PyObject *o)

返回Unicode字符串的长度(以代码点为单位)。 o 必须是“规范”表示形式中的Unicode对象(未选中)。

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 新版功能.

Deprecated since version 3.10, will be removed in version 3.12: PyUnicode_WCHAR_KIND 被贬低。

int PyUnicode_KIND(PyObject *o)

返回一个pyunicode类常量(见上文),该常量指示此unicode对象用于存储其数据的每个字符的字节数。 o 必须是“规范”表示形式中的Unicode对象(未选中)。

3.3 新版功能.

void *PyUnicode_DATA(PyObject *o)

返回指向原始Unicode缓冲区的空指针。 o 必须是“规范”表示形式中的Unicode对象(未选中)。

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)

从Unicode对象读取字符 o 必须以“规范”表示。这比 PyUnicode_READ() 如果你连续读了多次。

3.3 新版功能.

PyUnicode_MAX_CHAR_VALUE(o)

返回适用于根据创建另一个字符串的最大代码点 o 必须以“规范”表示。这总是一个近似值,但比在字符串上迭代更有效。

3.3 新版功能.

Py_ssize_t PyUnicode_GET_SIZE(PyObject *o)

返回已弃用的大小 Py_UNICODE 以代码单位表示(这包括作为2个单位的代理项对)。 o 必须是Unicode对象(未选中)。

Deprecated since version 3.3, will be removed in version 3.12: 是旧式Unicode API的一部分,请迁移到 PyUnicode_GET_LENGTH() .

Py_ssize_t PyUnicode_GET_DATA_SIZE(PyObject *o)

返回已弃用的大小 Py_UNICODE 以字节表示。 o 必须是Unicode对象(未选中)。

Deprecated since version 3.3, will be removed in version 3.12: 是旧式Unicode 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 参数必须是Unicode对象(未选中)。

在 3.3 版更改: 这个宏现在效率低下——因为在许多情况下, Py_UNICODE 表示不存在,需要创建--并且可能失败(返回 NULL 异常集)。尝试导入代码以使用新的 PyUnicode_nBYTE_DATA() 宏或用法 PyUnicode_WRITE()PyUnicode_READ() .

Deprecated since version 3.3, will be removed in version 3.12: 作为旧式Unicode API的一部分,请使用 PyUnicode_nBYTE_DATA() 宏系列。

int PyUnicode_IsIdentifier(PyObject *o)

返回 1 如果字符串是根据语言定义的有效标识符,则 标识符和关键字 . 返回 0 否则。

在 3.9 版更改: 函数不调用 Py_FatalError() 如果绳子还没准备好的话。

Unicode字符属性

Unicode提供许多不同的字符属性。最经常需要的宏可以通过这些宏获得,这些宏根据Python配置映射到C函数。

int Py_UNICODE_ISSPACE(Py_UNICODE ch)

返回 10 取决于 ch 是空白字符。

int Py_UNICODE_ISLOWER(Py_UNICODE ch)

返回 10 取决于 ch 是小写字符。

int Py_UNICODE_ISUPPER(Py_UNICODE ch)

返回 10 取决于 ch 是大写字符。

int Py_UNICODE_ISTITLE(Py_UNICODE ch)

返回 10 取决于 ch 是一个标题字符。

int Py_UNICODE_ISLINEBREAK(Py_UNICODE ch)

返回 10 取决于 ch 是换行符。

int Py_UNICODE_ISDECIMAL(Py_UNICODE ch)

返回 10 取决于 ch 是十进制字符。

int Py_UNICODE_ISDIGIT(Py_UNICODE ch)

返回 10 取决于 ch 是数字字符。

int Py_UNICODE_ISNUMERIC(Py_UNICODE ch)

返回 10 取决于 ch 是数字字符。

int Py_UNICODE_ISALPHA(Py_UNICODE ch)

返回 10 取决于 ch 是字母字符。

int Py_UNICODE_ISALNUM(Py_UNICODE ch)

返回 10 取决于 ch 是字母数字字符。

int Py_UNICODE_ISPRINTABLE(Py_UNICODE ch)

返回 10 取决于 ch 是可打印字符。不可打印字符是Unicode字符数据库中定义为“其他”或“分隔符”的字符,但被视为可打印的ASCII空间(0x20)除外。(请注意,此上下文中的可打印字符是在以下情况下不应转义的字符: repr() 对字符串调用。它与处理写入的字符串无关 sys.stdoutsys.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_cs4值。 highlow 分别是代理对中的前导和尾随代理。

创建和访问Unicode字符串

要创建Unicode对象并访问其基本序列属性,请使用以下API:

PyObject *PyUnicode_New(Py_ssize_t size, Py_UCS4 maxchar)
Return value: New reference.

创建新的Unicode对象。 麦克沙尔 应该是要放置在字符串中的真正最大代码点。作为近似值,它可以四舍五入到序列127255655351114111中最接近的值。

这是分配新Unicode对象的推荐方法。使用此函数创建的对象不可调整大小。

3.3 新版功能.

PyObject *PyUnicode_FromKindAndData(int kind, const void *buffer, Py_ssize_t size)
Return value: New reference.

使用给定的 kind (可能的值为 PyUnicode_1BYTE_KIND 等,由返回 PyUnicode_KIND() )这个 缓冲区 必须指向 size 每个字符1、2或4个字节的单位,如种类所示。

3.3 新版功能.

PyObject *PyUnicode_FromStringAndSize(const char *u, Py_ssize_t size)
Return value: New reference.

从字符缓冲区创建Unicode对象 u . 字节将被解释为UTF-8编码。缓冲区被复制到新对象中。如果缓冲区不是 NULL 返回值可能是共享对象,即不允许修改数据。

如果 uNULL ,此函数的行为如下 PyUnicode_FromUnicode() 将缓冲区设置为 NULL . 此用法已弃用,取而代之的是 PyUnicode_New() .

PyObject *PyUnicode_FromString(const char *u)
Return value: New reference.

从UTF-8编码的以空结尾的字符缓冲区创建Unicode对象 u .

PyObject *PyUnicode_FromFormat(const char *format, ...)
Return value: New reference.

采取C printf() 风格 格式 字符串和变量个数的参数,计算得到的python unicode字符串的大小,并返回一个字符串,其中包含格式化为该字符串的值。变量参数必须是C类型,并且必须与中的格式字符完全对应。 格式 ASCII编码字符串。允许以下格式字符:

设置字符格式

类型

评论

%%

n/a

文字%字符。

%c

int

单个字符,表示为C int。

%d

int

相当于 printf("%d") . 1

%u

无符号整型

相当于 printf("%u") . 1

%ld

长的

相当于 printf("%ld") . 1

%li

长的

相当于 printf("%li") . 1

%lu

无符号长

相当于 printf("%lu") . 1

%lld

长长

相当于 printf("%lld") . 1

%lli

长长

相当于 printf("%lli") . 1

%llu

无符号长整型

相当于 printf("%llu") . 1

%zd

Py_ssize_t

相当于 printf("%zd") . 1

%zi

Py_ssize_t

相当于 printf("%zi") . 1

%zu

size_t

相当于 printf("%zu") . 1

%i

int

相当于 printf("%i") . 1

%x

int

相当于 printf("%x") . 1

%s

常量字符 *

以空结尾的C字符数组。

%p

常数空隙 *

C指针的十六进制表示。主要相当于 printf("%p") 除了保证从字面开始 0x 不管平台是什么 printf 产量。

%A

PyObject *

调用的结果 ascii() .

%U

PyObject *

Unicode对象。

%V

PyObject * conchar *

Unicode对象(可能是 NULL )以及以空结尾的C字符数组作为第二个参数(如果第一个参数是 NULL

%S

PyObject *

调用的结果 PyObject_Str() .

%R

PyObject *

调用的结果 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)
Return value: New reference.

相同的 PyUnicode_FromFormat() 但它只需要两个参数。

PyObject *PyUnicode_FromEncodedObject(PyObject *obj, const char *encoding, const char *errors)
Return value: New reference.

解码编码对象 obj 到Unicode对象。

bytesbytearraybytes-like objects 根据给定的 编码 并使用由定义的错误处理 错误 . 两者都可以 NULL 要让接口使用默认值(请参见 内置编译码器 详情请参阅。

所有其他对象,包括Unicode对象,都会导致 TypeError 被设定。

API返回 NULL 如果有错误。调用方负责递减返回的对象。

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 并在出错时引发异常。

3.3 新版功能.

int PyUnicode_WriteChar(PyObject *unicode, Py_ssize_t index, Py_UCS4 character)

将字符写入字符串。字符串必须是通过 PyUnicode_New() . 因为unicode字符串应该是不可变的,所以不能共享该字符串,也不能对其进行hash运算。

此函数检查 unicode 是Unicode对象,索引没有越界,并且可以安全地修改该对象(即其引用计数为1)。

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)
Return value: New reference.

返回的子字符串 str ,来自字符索引 开始 (包括)到字符索引 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 如果 缓冲区长度 小于 u缓冲区 成功时返回。

3.3 新版功能.

Py_UCS4 *PyUnicode_AsUCS4Copy(PyObject *u)

复制字符串 u 到新的UCS4缓冲区中,该缓冲区使用 PyMem_Malloc() . 如果失败了, NULL 返回时带有 MemoryError 集合。返回的缓冲区总是附加了额外的空代码点。

3.3 新版功能.

不推荐使用的py-unicode API

Deprecated since version 3.3, will be removed in version 4.0.

这些API函数在实现 PEP 393 . 扩展模块可以继续使用它们,因为它们在python 3.x中不会被删除,但需要注意,它们的使用现在可能会导致性能和内存命中。

PyObject *PyUnicode_FromUnicode(const Py_UNICODE *u, Py_ssize_t size)
Return value: New reference.

从py_unicode缓冲区创建unicode对象 u 给定大小的。 u 可能是 NULL 导致内容未定义。用户有责任填写所需的数据。缓冲区被复制到新对象中。

如果缓冲区不是 NULL ,返回值可能是共享对象。因此,只有当 uNULL .

如果缓冲区是 NULLPyUnicode_READY() 在使用任何访问宏(如 PyUnicode_KIND() .

Deprecated since version 3.3, will be removed in version 3.12: 是旧式Unicode API的一部分,请迁移到 PyUnicode_FromKindAndData()PyUnicode_FromWideChar()PyUnicode_New() .

Py_UNICODE *PyUnicode_AsUnicode(PyObject *unicode)

返回指向Unicode对象内部的只读指针 Py_UNICODE 缓冲器,或 NULL 关于错误。这将创建 Py_UNICODE* 如果对象尚不可用,则表示该对象。缓冲区总是以额外的空代码点终止。注意结果 Py_UNICODE 字符串还可以包含嵌入的空代码点,这将导致在大多数C函数中使用时截断字符串。

Deprecated since version 3.3, will be removed in version 3.12: 是旧式Unicode API的一部分,请迁移到 PyUnicode_AsUCS4()PyUnicode_AsWideChar()PyUnicode_ReadChar() 或类似的新API。

PyObject *PyUnicode_TransformDecimalToASCII(Py_UNICODE *s, Py_ssize_t size)
Return value: New reference.

通过替换中的所有十进制数字来创建Unicode对象 Py_UNICODE 给定的缓冲区 size 根据十进制值,用ASCII数字0-9表示。返回 NULL 如果发生异常。

Py_UNICODE *PyUnicode_AsUnicodeAndSize(PyObject *unicode, Py_ssize_t *size)

类似于 PyUnicode_AsUnicode() ,但也保存了 Py_UNICODE() 中的数组长度(不包括额外的空终止符) size . 注意结果 Py_UNICODE* 字符串可能包含嵌入的空代码点,这将导致在大多数C函数中使用时截断字符串。

3.3 新版功能.

Deprecated since version 3.3, will be removed in version 3.12: 是旧式Unicode API的一部分,请迁移到 PyUnicode_AsUCS4()PyUnicode_AsWideChar()PyUnicode_ReadChar() 或类似的新API。

Py_ssize_t PyUnicode_GetSize(PyObject *unicode)

返回已弃用的大小 Py_UNICODE 以代码单位表示(这包括作为2个单位的代理项对)。

Deprecated since version 3.3, will be removed in version 3.12: 是旧式Unicode API的一部分,请迁移到 PyUnicode_GET_LENGTH() .

PyObject *PyUnicode_FromObject(PyObject *obj)
Return value: New reference.

如有必要,将unicode子类型的实例复制到新的true unicode对象。如果 obj 已经是一个真正的Unicode对象(不是子类型),请使用递增的refcount返回引用。

非Unicode或其子类型的对象将导致 TypeError .

区域编码

当前的区域设置编码可用于从操作系统解码文本。

PyObject *PyUnicode_DecodeLocaleAndSize(const char *str, Py_ssize_t len, const char *errors)
Return value: New reference.

从android和vxworks上的utf-8或其他平台上的当前区域设置编码中解码字符串。支持的错误处理程序是 "strict""surrogateescape" (PEP 383 )解码器使用 "strict" 错误处理程序if errorsNULL . str 必须以空字符结尾,但不能包含嵌入的空字符。

使用 PyUnicode_DecodeFSDefaultAndSize() 从中解码字符串 Py_FileSystemDefaultEncoding (在python启动时读取的区域设置编码)。

此函数忽略 Python UTF-8 Mode

参见

这个 Py_DecodeLocale() 功能。

3.3 新版功能.

在 3.7 版更改: 函数现在还使用当前的区域设置编码 surrogateescape 错误处理程序,Android除外。以前, Py_DecodeLocale() 用于 surrogateescape ,并且当前的区域设置编码用于 strict .

PyObject *PyUnicode_DecodeLocale(const char *str, const char *errors)
Return value: New reference.

类似 PyUnicode_DecodeLocaleAndSize() ,但使用 strlen() .

3.3 新版功能.

PyObject *PyUnicode_EncodeLocale(PyObject *unicode, const char *errors)
Return value: New reference.

在android和vxworks上将unicode对象编码为utf-8,或者在其他平台上将其编码为当前的区域设置编码。支持的错误处理程序是 "strict""surrogateescape" (PEP 383 )编码器使用 "strict" 错误处理程序if errorsNULL . 返回A bytes 对象。 unicode 不能包含嵌入的空字符。

使用 PyUnicode_EncodeFSDefault() 将字符串编码为 Py_FileSystemDefaultEncoding (在python启动时读取的区域设置编码)。

此函数忽略 Python UTF-8 Mode

参见

这个 Py_EncodeLocale() 功能。

3.3 新版功能.

在 3.7 版更改: 函数现在还使用当前的区域设置编码 surrogateescape 错误处理程序,Android除外。以前, Py_EncodeLocale() 用于 surrogateescape ,并且当前的区域设置编码用于 strict .

文件系统编码

要对文件名和其他环境字符串进行编码和解码, Py_FileSystemDefaultEncoding 应该用作编码,并且 Py_FileSystemDefaultEncodeErrors 应用作错误处理程序 (PEP 383PEP 529 )将文件名编码为 bytes 在参数解析过程中, "O&" 应使用转换器,通过 PyUnicode_FSConverter() 作为转换函数:

int PyUnicode_FSConverter(PyObject *obj, void *result)

ParseTuple转换器:编码 str 对象——直接或通过 os.PathLike 接口——对 bytes 使用 PyUnicode_EncodeFSDefault()bytes 对象按原样输出。 结果 必须是 PyBytesObject* 必须在不再使用时释放。

3.1 新版功能.

在 3.6 版更改: 接受一 path-like object .

将文件名解码为 str 在参数解析过程中, "O&" 应使用转换器,通过 PyUnicode_FSDecoder() 作为转换函数:

int PyUnicode_FSDecoder(PyObject *obj, void *result)

ParseTuple转换器:解码 bytes 对象——直接或间接通过 os.PathLike 接口——对 str 使用 PyUnicode_DecodeFSDefaultAndSize()str 对象按原样输出。 结果 必须是 PyUnicodeObject* 必须在不再使用时释放。

3.2 新版功能.

在 3.6 版更改: 接受一 path-like object .

PyObject *PyUnicode_DecodeFSDefaultAndSize(const char *s, Py_ssize_t size)
Return value: New reference.

对象中的字符串进行解码。 filesystem encoding and error handler

如果 Py_FileSystemDefaultEncoding 未设置,请返回到区域设置编码。

Py_FileSystemDefaultEncoding 从区域设置编码启动时初始化,以后无法修改。如果需要从当前区域设置编码中解码字符串,请使用 PyUnicode_DecodeLocaleAndSize() .

参见

这个 Py_DecodeLocale() 功能。

在 3.6 版更改: 使用 Py_FileSystemDefaultEncodeErrors 错误处理程序。

PyObject *PyUnicode_DecodeFSDefault(const char *s)
Return value: New reference.

方法中解码以NULL结尾的字符串。 filesystem encoding and error handler

如果 Py_FileSystemDefaultEncoding 未设置,请返回到区域设置编码。

使用 PyUnicode_DecodeFSDefaultAndSize() 如果你知道绳子的长度。

在 3.6 版更改: 使用 Py_FileSystemDefaultEncodeErrors 错误处理程序。

PyObject *PyUnicode_EncodeFSDefault(PyObject *unicode)
Return value: New reference.

将Unicode对象编码为 Py_FileSystemDefaultEncodingPy_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)
Return value: New reference.

从创建Unicode对象 wchar_t 缓冲区 w 给定的 size .经过 -1 作为 size 指示函数本身必须使用wcslen计算长度。返回 NULL 失败论。

Py_ssize_t PyUnicode_AsWideChar(PyObject *unicode, wchar_t *w, Py_ssize_t size)

将Unicode对象内容复制到 wchar_t 缓冲区 w . 至多 size wchar_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* 字符串包含空字符a ValueError 提高了。

返回由分配的缓冲区 PyMem_Alloc() (使用) PyMem_Free() 在成功的时候。出错时返回 NULL*size 是未定义的。提出一个 MemoryError 如果内存分配失败。

3.2 新版功能.

在 3.7 版更改: 提出一个 ValueError 如果 sizeNULL 以及 wchar_t* 字符串包含空字符。

内置编译码器

Python提供了一组内置的编解码器,这些编解码器是用C语言编写的,以提高速度。所有这些编解码器都可以通过以下函数直接使用。

以下许多API采用两个参数编码和错误,它们的语义与内置API的语义相同 str() 字符串对象构造函数。

正在将编码设置为 NULL 导致使用默认编码,即UTF-8。文件系统调用应该使用 PyUnicode_FSConverter() 用于编码文件名。它使用变量 Py_FileSystemDefaultEncoding 内部的。此变量应被视为只读:在某些系统上,它将是指向静态字符串的指针,在其他系统上,它将在运行时更改(例如,当应用程序调用setlocale时)。

错误处理由错误设置,也可以设置为 NULL 表示使用为编解码器定义的默认处理。所有内置编解码器的默认错误处理都是“严格的” (ValueError 提高了)。

编解码器都使用类似的接口。为了简单起见,只记录了与以下一般情况的偏差。

通用编译码器

这些是通用编解码器API:

PyObject *PyUnicode_Decode(const char *s, Py_ssize_t size, const char *encoding, const char *errors)
Return value: New reference.

通过解码创建Unicode对象 size 编码字符串的字节数 s . 编码错误 与中同名参数的含义相同 str() 内置功能。使用python codec注册表查找要使用的编解码器。返回 NULL 如果编解码器引发异常。

PyObject *PyUnicode_AsEncodedString(PyObject *unicode, const char *encoding, const char *errors)
Return value: New reference.

对unicode对象进行编码,并将结果返回为python bytes对象。 编码错误 与Unicode中同名参数的含义相同 encode() 方法。使用python codec注册表查找要使用的编解码器。返回 NULL 如果编解码器引发异常。

PyObject *PyUnicode_Encode(const Py_UNICODE *s, Py_ssize_t size, const char *encoding, const char *errors)
Return value: New reference.

编码 Py_UNICODE 缓冲区 s 给定的 size 并返回一个python bytes对象。 编码错误 与Unicode中同名参数的含义相同 encode() 方法。使用python codec注册表查找要使用的编解码器。返回 NULL 如果编解码器引发异常。

Deprecated since version 3.3, will be removed in version 4.0: 旧风格的一部分 Py_UNICODE API;请迁移到使用 PyUnicode_AsEncodedString() .

UTF-8编解码器

这些是UTF-8编解码器API:

PyObject *PyUnicode_DecodeUTF8(const char *s, Py_ssize_t size, const char *errors)
Return value: New reference.

通过解码创建Unicode对象 size UTF-8编码字符串的字节数 s . 返回 NULL 如果编解码器引发异常。

PyObject *PyUnicode_DecodeUTF8Stateful(const char *s, Py_ssize_t size, const char *errors, Py_ssize_t *consumed)
Return value: New reference.

如果 消耗NULL 表现得像 PyUnicode_DecodeUTF8() .如果 消耗 不是 NULL ,尾随不完整的UTF-8字节序列将不会被视为错误。将不解码这些字节,已解码的字节数将存储在 消耗 .

PyObject *PyUnicode_AsUTF8String(PyObject *unicode)
Return value: New reference.

使用utf-8对unicode对象进行编码,并将结果返回为python bytes对象。错误处理是“严格的”。返回 NULL 如果编解码器引发异常。

const char *PyUnicode_AsUTF8AndSize(PyObject *unicode, Py_ssize_t *size)

返回指向Unicode对象的UTF-8编码的指针,并将编码表示形式的大小(以字节为单位)存储在 size . 这个 size 参数可以是 NULL ;在这种情况下,不会存储任何大小。返回的缓冲区总是追加一个额外的空字节(不包括在 size ,无论是否有其他空代码点。

如果出现错误, NULL 返回异常集,不返回 size 存储。

这将缓存Unicode对象中字符串的UTF-8表示形式,随后的调用将返回指向同一缓冲区的指针。调用方不负责释放缓冲区。

3.3 新版功能.

在 3.7 版更改: 返回类型现在为 const char * 而不是 char * .

在 3.10 版更改: 此函数是 limited API

const char *PyUnicode_AsUTF8(PyObject *unicode)

AS PyUnicode_AsUTF8AndSize() ,但不存储大小。

3.3 新版功能.

在 3.7 版更改: 返回类型现在为 const char * 而不是 char * .

PyObject *PyUnicode_EncodeUTF8(const Py_UNICODE *s, Py_ssize_t size, const char *errors)
Return value: New reference.

编码 Py_UNICODE 缓冲区 s 给定的 size 使用utf-8并返回python bytes对象。返回 NULL 如果编解码器引发异常。

Deprecated since version 3.3, will be removed in version 4.0: 旧风格的一部分 Py_UNICODE API;请迁移到使用 PyUnicode_AsUTF8String()PyUnicode_AsUTF8AndSize()PyUnicode_AsEncodedString() .

UTF 32编解码器

这些是UTF-32编解码器API:

PyObject *PyUnicode_DecodeUTF32(const char *s, Py_ssize_t size, const char *errors, int *byteorder)
Return value: New reference.

译码 size 来自UTF-32编码缓冲区字符串的字节,并返回相应的Unicode对象。 错误 (如果非-NULL)定义错误处理。它默认为“严格”。

如果 字节顺序 是非-``NULL`,解码器使用给定的字节顺序开始解码:

*byteorder == -1: little endian
*byteorder == 0:  native order
*byteorder == 1:  big endian

如果 *byteorder 为零,输入数据的前四个字节是字节顺序标记(bom),解码器切换到此字节顺序,而bom不会复制到生成的unicode字符串中。如果 *byteorder-11 ,任何字节顺序标记都将复制到输出。

完成后, *byteorder 设置为输入数据末尾的当前字节顺序。

如果 字节顺序NULL ,编解码器以本机顺序模式启动。

返回 NULL 如果编解码器引发异常。

PyObject *PyUnicode_DecodeUTF32Stateful(const char *s, Py_ssize_t size, const char *errors, int *byteorder, Py_ssize_t *consumed)
Return value: New reference.

如果 消耗NULL 表现得像 PyUnicode_DecodeUTF32() .如果 消耗 不是 NULLPyUnicode_DecodeUTF32Stateful() 不会将尾随的不完整的UTF-32字节序列(例如不能被4整除的字节数)视为错误。将不解码这些字节,已解码的字节数将存储在 消耗 .

PyObject *PyUnicode_AsUTF32String(PyObject *unicode)
Return value: New reference.

以本机字节顺序使用UTF-32编码返回python字节字符串。字符串总是以物料清单标记开头。错误处理是“严格的”。返回 NULL 如果编解码器引发异常。

PyObject *PyUnicode_EncodeUTF32(const Py_UNICODE *s, Py_ssize_t size, const char *errors, int byteorder)
Return value: New reference.

返回一个python bytes对象,该对象包含unicode数据的utf-32编码值 s . 输出按以下字节顺序写入:

byteorder == -1: little endian
byteorder == 0:  native byte order (writes a BOM mark)
byteorder == 1:  big endian

如果是顺序 0 ,输出字符串将始终以unicode bom标记(u+feff)开头。在其他两种模式中,没有预先设置物料清单标记。

如果 Py_UNICODE_WIDE 未定义,代理项对将作为单个代码点输出。

返回 NULL 如果编解码器引发异常。

Deprecated since version 3.3, will be removed in version 4.0: 旧风格的一部分 Py_UNICODE API;请迁移到使用 PyUnicode_AsUTF32String()PyUnicode_AsEncodedString() .

UTF—16编解码器

这些是UTF-16编解码器API:

PyObject *PyUnicode_DecodeUTF16(const char *s, Py_ssize_t size, const char *errors, int *byteorder)
Return value: New reference.

译码 size 来自UTF-16编码缓冲区字符串的字节,并返回相应的Unicode对象。 错误 (如果非-NULL)定义错误处理。它默认为“严格”。

如果 字节顺序 是非-``NULL`,解码器使用给定的字节顺序开始解码:

*byteorder == -1: little endian
*byteorder == 0:  native order
*byteorder == 1:  big endian

如果 *byteorder 为零,输入数据的前两个字节是字节顺序标记(bom),解码器切换到此字节顺序,而bom不会复制到生成的unicode字符串中。如果 *byteorder-11 ,任何字节顺序标记都将复制到输出(在输出中,它将导致 \ufeff 或A \ufffe 性格)

完成后, *byteorder 设置为输入数据末尾的当前字节顺序。

如果 字节顺序NULL ,编解码器以本机顺序模式启动。

返回 NULL 如果编解码器引发异常。

PyObject *PyUnicode_DecodeUTF16Stateful(const char *s, Py_ssize_t size, const char *errors, int *byteorder, Py_ssize_t *consumed)
Return value: New reference.

如果 消耗NULL 表现得像 PyUnicode_DecodeUTF16() .如果 消耗 不是 NULLPyUnicode_DecodeUTF16Stateful() 不会将尾随不完整的UTF-16字节序列(例如奇数字节或拆分代理项对)视为错误。将不解码这些字节,已解码的字节数将存储在 消耗 .

PyObject *PyUnicode_AsUTF16String(PyObject *unicode)
Return value: New reference.

以本机字节顺序使用UTF-16编码返回python字节字符串。字符串总是以物料清单标记开头。错误处理是“严格的”。返回 NULL 如果编解码器引发异常。

PyObject *PyUnicode_EncodeUTF16(const Py_UNICODE *s, Py_ssize_t size, const char *errors, int byteorder)
Return value: New reference.

返回一个python bytes对象,该对象保存unicode数据的utf-16编码值 s . 输出按以下字节顺序写入:

byteorder == -1: little endian
byteorder == 0:  native byte order (writes a BOM mark)
byteorder == 1:  big endian

如果是顺序 0 ,输出字符串将始终以unicode bom标记(u+feff)开头。在其他两种模式中,没有预先设置物料清单标记。

如果 Py_UNICODE_WIDE 定义为,单个 Py_UNICODE 值可以表示为代理项对。如果没有定义,每个 Py_UNICODE 值被解释为UCS-2字符。

返回 NULL 如果编解码器引发异常。

Deprecated since version 3.3, will be removed in version 4.0: 旧风格的一部分 Py_UNICODE API;请迁移到使用 PyUnicode_AsUTF16String()PyUnicode_AsEncodedString() .

UTF—7编解码器

这些是UTF-7编解码器API:

PyObject *PyUnicode_DecodeUTF7(const char *s, Py_ssize_t size, const char *errors)
Return value: New reference.

通过解码创建Unicode对象 size UTF-7编码字符串的字节数 s . 返回 NULL 如果编解码器引发异常。

PyObject *PyUnicode_DecodeUTF7Stateful(const char *s, Py_ssize_t size, const char *errors, Py_ssize_t *consumed)
Return value: New reference.

如果 消耗NULL 表现得像 PyUnicode_DecodeUTF7() . 如果 消耗 不是 NULL ,尾随不完整的utf-7 base-64节将不会被视为错误。将不解码这些字节,已解码的字节数将存储在 消耗 .

PyObject *PyUnicode_EncodeUTF7(const Py_UNICODE *s, Py_ssize_t size, int base64SetO, int base64WhiteSpace, const char *errors)
Return value: New reference.

编码 Py_UNICODE 使用utf-7并返回python bytes对象的给定大小的缓冲区。返回 NULL 如果编解码器引发异常。

如果 Base64 SETO 非零,“set o”(没有其他特殊含义的标点)将编码在base-64中。如果 基准64空白 为非零,空白将以base-64编码。对于python的“utf-7”编解码器,两者都设置为零。

Deprecated since version 3.3, will be removed in version 4.0: 旧风格的一部分 Py_UNICODE API;请迁移到使用 PyUnicode_AsEncodedString() .

Unicode转义编解码器

这些是“Unicode Escape”编解码器API:

PyObject *PyUnicode_DecodeUnicodeEscape(const char *s, Py_ssize_t size, const char *errors)
Return value: New reference.

通过解码创建Unicode对象 size Unicode转义编码字符串的字节数 s . 返回 NULL 如果编解码器引发异常。

PyObject *PyUnicode_AsUnicodeEscapeString(PyObject *unicode)
Return value: New reference.

使用unicode转义对unicode对象进行编码,并将结果作为bytes对象返回。错误处理是“严格的”。返回 NULL 如果编解码器引发异常。

PyObject *PyUnicode_EncodeUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size)
Return value: New reference.

编码 Py_UNICODE 给定的缓冲区 size 使用unicode转义并返回bytes对象。返回 NULL 如果编解码器引发异常。

Deprecated since version 3.3, will be removed in version 4.0: 旧风格的一部分 Py_UNICODE API;请迁移到使用 PyUnicode_AsUnicodeEscapeString() .

原始Unicode转义编解码器

这些是“原始Unicode转义”编解码器API:

PyObject *PyUnicode_DecodeRawUnicodeEscape(const char *s, Py_ssize_t size, const char *errors)
Return value: New reference.

通过解码创建Unicode对象 size 原始Unicode转义编码字符串的字节数 s . 返回 NULL 如果编解码器引发异常。

PyObject *PyUnicode_AsRawUnicodeEscapeString(PyObject *unicode)
Return value: New reference.

使用原始Unicode转义对Unicode对象进行编码,并将结果作为字节对象返回。错误处理是“严格的”。返回 NULL 如果编解码器引发异常。

PyObject *PyUnicode_EncodeRawUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size)
Return value: New reference.

编码 Py_UNICODE 给定的缓冲区 size 使用原始Unicode转义并返回bytes对象。返回 NULL 如果编解码器引发异常。

Deprecated since version 3.3, will be removed in version 4.0: 旧风格的一部分 Py_UNICODE API;请迁移到使用 PyUnicode_AsRawUnicodeEscapeString()PyUnicode_AsEncodedString() .

拉丁语-1编解码器

这些是Latin-1编解码器API:Latin-1对应于前256个Unicode序号,编码期间编解码器只接受这些序号。

PyObject *PyUnicode_DecodeLatin1(const char *s, Py_ssize_t size, const char *errors)
Return value: New reference.

通过解码创建Unicode对象 size Latin-1编码字符串的字节数 s . 返回 NULL 如果编解码器引发异常。

PyObject *PyUnicode_AsLatin1String(PyObject *unicode)
Return value: New reference.

使用Latin-1对Unicode对象进行编码,并将结果返回为python bytes对象。错误处理是“严格的”。返回 NULL 如果编解码器引发异常。

PyObject *PyUnicode_EncodeLatin1(const Py_UNICODE *s, Py_ssize_t size, const char *errors)
Return value: New reference.

编码 Py_UNICODE 给定的缓冲区 size 使用Latin-1并返回python bytes对象。返回 NULL 如果编解码器引发异常。

Deprecated since version 3.3, will be removed in version 4.0: 旧风格的一部分 Py_UNICODE API;请迁移到使用 PyUnicode_AsLatin1String()PyUnicode_AsEncodedString() .

ASCII编解码器

这些是ASCII编解码器API。只接受7位ASCII数据。所有其他代码都会产生错误。

PyObject *PyUnicode_DecodeASCII(const char *s, Py_ssize_t size, const char *errors)
Return value: New reference.

通过解码创建Unicode对象 size ASCII编码字符串的字节数 s . 返回 NULL 如果编解码器引发异常。

PyObject *PyUnicode_AsASCIIString(PyObject *unicode)
Return value: New reference.

使用ASCII对Unicode对象进行编码,并将结果作为python bytes对象返回。错误处理是“严格的”。返回 NULL 如果编解码器引发异常。

PyObject *PyUnicode_EncodeASCII(const Py_UNICODE *s, Py_ssize_t size, const char *errors)
Return value: New reference.

编码 Py_UNICODE 给定的缓冲区 size 使用ASCII并返回python bytes对象。返回 NULL 如果编解码器引发异常。

Deprecated since version 3.3, will be removed in version 4.0: 旧风格的一部分 Py_UNICODE API;请迁移到使用 PyUnicode_AsASCIIString()PyUnicode_AsEncodedString() .

字符映射编解码器

这个编解码器是特殊的,因为它可以用来实现许多不同的编解码器(实际上,这是为了获得包含在 encodings 封装)。编解码器使用映射对字符进行编码和解码。提供的映射对象必须支持 __getitem__() 映射接口;字典和序列工作良好。

以下是映射编解码器API:

PyObject *PyUnicode_DecodeCharmap(const char *data, Py_ssize_t size, PyObject *mapping, const char *errors)
Return value: New reference.

通过解码创建Unicode对象 size 编码字符串的字节数 s 使用给定的 映射 对象。返回 NULL 如果编解码器引发异常。

如果 映射NULL ,将应用拉丁文-1解码。否则 映射 必须将字节序数(0到255范围内的整数)映射到Unicode字符串、整数(然后被解释为Unicode序数)或 None . 未映射的数据字节--导致 LookupError 以及映射到 None0xFFFE'\ufffe' ,将被视为未定义的映射并导致错误。

PyObject *PyUnicode_AsCharmapString(PyObject *unicode, PyObject *mapping)
Return value: New reference.

使用给定的 映射 对象,并将结果作为字节对象返回。错误处理是“严格的”。返回 NULL 如果编解码器引发异常。

这个 映射 对象必须将Unicode顺序整数映射到字节对象,0到255范围内的整数或 None . 未映射的字符序号(导致 LookupError )以及映射到 None 被视为“未定义的映射”并导致错误。

PyObject *PyUnicode_EncodeCharmap(const Py_UNICODE *s, Py_ssize_t size, PyObject *mapping, const char *errors)
Return value: New reference.

编码 Py_UNICODE 给定的缓冲区 size 使用给定的 映射 对象,并将结果作为字节对象返回。返回 NULL 如果编解码器引发异常。

Deprecated since version 3.3, will be removed in version 4.0: 旧风格的一部分 Py_UNICODE API;请迁移到使用 PyUnicode_AsCharmapString()PyUnicode_AsEncodedString() .

以下编解码器API在将Unicode映射到Unicode时是特殊的。

PyObject *PyUnicode_Translate(PyObject *str, PyObject *table, const char *errors)
Return value: New reference.

通过对字符串应用字符映射表来转换字符串并返回结果Unicode对象。返回 NULL 如果编解码器引发异常。

映射表必须将Unicode顺序整数映射到Unicode顺序整数或 None (导致删除字符)。

映射表只需要提供 __getitem__() 界面;字典和序列工作良好。未映射的字符序号(导致 LookupError )保持原样,并按原样复制。

错误 对编解码器具有通常意义。它可能是 NULL 指示使用默认错误处理。

PyObject *PyUnicode_TranslateCharmap(const Py_UNICODE *s, Py_ssize_t size, PyObject *mapping, const char *errors)
Return value: New reference.

翻译一 Py_UNICODE 给定的缓冲区 size 通过应用一个字符 映射 表并返回生成的Unicode对象。返回 NULL 当编解码器引发异常时。

Deprecated since version 3.3, will be removed in version 4.0: 旧风格的一部分 Py_UNICODE API;请迁移到使用 PyUnicode_Translate() .或 generic codec based API

用于Windows的MBCS编解码器

这些是MBCS编解码器API。它们目前仅在Windows上可用,并使用win32 mbcs转换器来实现转换。注意,mbcs(或dbcs)是一类编码,而不仅仅是一类。目标编码由运行编解码器的计算机上的用户设置定义。

PyObject *PyUnicode_DecodeMBCS(const char *s, Py_ssize_t size, const char *errors)
Return value: New reference.

通过解码创建Unicode对象 size mbcs编码字符串的字节数 s . 返回 NULL 如果编解码器引发异常。

PyObject *PyUnicode_DecodeMBCSStateful(const char *s, Py_ssize_t size, const char *errors, Py_ssize_t *consumed)
Return value: New reference.

如果 消耗NULL 表现得像 PyUnicode_DecodeMBCS() .如果 消耗 不是 NULLPyUnicode_DecodeMBCSStateful() 将不解码尾随的前导字节,已解码的字节数将存储在 消耗 .

PyObject *PyUnicode_AsMBCSString(PyObject *unicode)
Return value: New reference.

使用mbcs对unicode对象进行编码,并将结果返回为python bytes对象。错误处理是“严格的”。返回 NULL 如果编解码器引发异常。

PyObject *PyUnicode_EncodeCodePage(int code_page, PyObject *unicode, const char *errors)
Return value: New reference.

使用指定的代码页对unicode对象进行编码,并返回python bytes对象。返回 NULL 如果编解码器引发异常。使用 CP_ACP 获取MBCS编码器的代码页。

3.3 新版功能.

PyObject *PyUnicode_EncodeMBCS(const Py_UNICODE *s, Py_ssize_t size, const char *errors)
Return value: New reference.

编码 Py_UNICODE 给定的缓冲区 size 使用mbcs并返回python bytes对象。返回 NULL 如果编解码器引发异常。

Deprecated since version 3.3, will be removed in version 4.0: 旧风格的一部分 Py_UNICODE API;请迁移到使用 PyUnicode_AsMBCSString()PyUnicode_EncodeCodePage()PyUnicode_AsEncodedString() .

方法和插槽

方法和Slot函数

以下API能够在输入时处理Unicode对象和字符串(我们在描述中将它们称为字符串),并根据需要返回Unicode对象或整数。

他们都回来了 NULL-1 如果发生异常。

PyObject *PyUnicode_Concat(PyObject *left, PyObject *right)
Return value: New reference.

连接两个字符串以生成新的Unicode字符串。

PyObject *PyUnicode_Split(PyObject *s, PyObject *sep, Py_ssize_t maxsplit)
Return value: New reference.

拆分一个提供Unicode字符串列表的字符串。如果 sepNULL ,将在所有空白子字符串上执行拆分。否则,在给定的分隔符处会发生拆分。至多 最大分割 将进行拆分。如果为负,则不设置限制。结果列表中不包含分隔符。

PyObject *PyUnicode_Splitlines(PyObject *s, int keepend)
Return value: New reference.

在换行符处拆分一个Unicode字符串,返回一个Unicode字符串列表。CRLF被认为是一个换行符。如果 守护者0 ,换行符不包含在生成的字符串中。

PyObject *PyUnicode_Join(PyObject *separator, PyObject *seq)
Return value: New reference.

使用给定的 分离器 并返回生成的Unicode字符串。

Py_ssize_t PyUnicode_Tailmatch(PyObject *str, PyObject *substr, Py_ssize_t start, Py_ssize_t end, int direction)

返回 1 如果 子串 比赛 str[start:end] 在给定的尾部( 方向 = -1 表示进行前缀匹配, 方向 = 1 后缀匹配) 0 否则。返回 -1 如果发生错误。

Py_ssize_t PyUnicode_Find(PyObject *str, PyObject *substr, Py_ssize_t start, Py_ssize_t end, int direction)

返回的第一个位置 子串 在里面 str[start:end] 使用给定的 方向方向 = 1 意思是向前搜索, 方向 = -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] 使用给定的 方向方向 = 1 意思是向前搜索, 方向 = -1 反向搜索)。返回值是第一个匹配的索引;值为 -1 指示未找到匹配项,并且 -2 指示发生错误并设置了异常。

3.3 新版功能.

在 3.7 版更改: 开始end 现在被调整成 str[start:end] .

Py_ssize_t PyUnicode_Count(PyObject *str, PyObject *substr, Py_ssize_t start, Py_ssize_t end)

返回 子串 在里面 str[start:end] . 返回 -1 如果发生错误。

PyObject *PyUnicode_Replace(PyObject *str, PyObject *substr, PyObject *replstr, Py_ssize_t maxcount)
Return value: New reference.

最多替换 最大数量 出现次数 子串 在里面 str 具有 应答器 并返回生成的Unicode对象。 最大数量 = -1 表示替换所有事件。

int PyUnicode_Compare(PyObject *left, PyObject *right)

比较两个字符串并返回 -101 分别表示小于、等于和大于。

此函数返回 -1 一旦失败,就应该调用 PyErr_Occurred() 检查是否有错误。

int PyUnicode_CompareWithASCIIString(PyObject *uni, const char *string)

比较unicode对象, uni一串 然后返回 -101 分别表示小于、等于和大于。最好只传递ASCII编码的字符串,但如果输入字符串包含非ASCII字符,则函数将其解释为ISO-8859-1。

此函数不会引发异常。

PyObject *PyUnicode_RichCompare(PyObject *left, PyObject *right, int op)
Return value: New reference.

Rich比较两个Unicode字符串并返回以下其中一个:

  • NULL 如果出现异常

  • Py_TruePy_False 为了成功比较

  • Py_NotImplemented 如果类型组合未知

的可能值 opPy_GTPy_GEPy_EQPy_NEPy_LTPy_LE .

PyObject *PyUnicode_Format(PyObject *format, PyObject *args)
Return value: New reference.

从返回新的字符串对象 格式args ;这类似于 format % args .

int PyUnicode_Contains(PyObject *container, PyObject *element)

检查是否 要素 包含在 容器 并相应地返回真或假。

要素 必须强制为一个元素unicode字符串。 -1 如果出现错误,则返回。

void PyUnicode_InternInPlace(PyObject **string)

实习辩论 *string 到位。参数必须是指向python unicode字符串对象的指针变量的地址。如果存在与 *string ,它设置 *string 对它(减少旧字符串对象的引用计数并增加实习字符串对象的引用计数),否则它将离开 *string 单独并实习(增加其引用计数)。(说明:尽管有很多关于引用计数的讨论,但可以将此函数视为引用计数中性函数;只有在调用前拥有对象时,调用后才拥有该对象。)

PyObject *PyUnicode_InternFromString(const char *v)
Return value: New reference.

结合 PyUnicode_FromString()PyUnicode_InternInPlace() ,返回一个新的已实习的Unicode字符串对象,或返回对具有相同值的先前实习字符串对象的新(“拥有”)引用。