Unicode 对象和编解码器

Unicode Objects

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

Py_UNICODE*和 UTF-8 表示形式是按需创建的,并缓存在 Unicode 对象中。 Py_UNICODE*表示形式已弃用且效率低下;在对性能或内存敏感的情况下,应避免使用它。

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

Unicode Type

这些是用于 Python 中 Unicode 实现的基本 Unicode 对象类型:

版本 3.3 中的新Function。

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

版本 3.3 中的新Function。

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

如果成功,则返回0;如果失败,则返回-1;如果失败,则返回异常,特别是在内存分配失败的情况下。

版本 3.3 中的新Function。

版本 3.3 中的新Function。

版本 3.3 中的新Function。

版本 3.3 中的新Function。

版本 3.3 中的新Function。

版本 3.3 中的新Function。

版本 3.3 中的新Function。

版本 3.3 中的新Function。

版本 3.3 中的新Function。

版本 3.3 中的新Function。

从版本 3.3 开始不推荐使用,将在版本 4.0 中删除:旧式 Unicode API 的一部分,请迁移到使用PyUnicode_GET_LENGTH()

从版本 3.3 开始不推荐使用,将在版本 4.0 中删除:旧式 Unicode API 的一部分,请迁移到使用PyUnicode_GET_LENGTH()

在版本 3.3 中进行了更改:该宏现在效率低下-因为在许多情况下Py_UNICODE表示形式不存在,需要创建-并且可能会失败(返回NULL并且设置了异常)。try移植代码以使用新的PyUnicode_nBYTE_DATA()宏或使用PyUnicode_WRITE()PyUnicode_READ()

从版本 3.3 开始不推荐使用,将在版本 4.0 中删除:作为旧版 Unicode API 的一部分,请迁移到使用PyUnicode_nBYTE_DATA()系列宏。

Unicode 字符属性

Unicode 提供许多不同的字符属性。pass这些宏可以使用最常用的宏,这些宏根据 Python 配置 Map 到 C 函数。

这些 API 可用于快速直接字符转换:

从版本 3.3 开始不推荐使用:此函数使用简单的大小写 Map。

从版本 3.3 开始不推荐使用:此函数使用简单的大小写 Map。

从版本 3.3 开始不推荐使用:此函数使用简单的大小写 Map。

这些 API 可用于处理代理:

创建和访问 Unicode 字符串

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

创建一个新的 Unicode 对象。 * maxchar *应该是放置在字符串中的真实最大代码点。作为近似值,可以将其四舍五入到序列 127、255、65535、1114111 中的最接近值。

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

版本 3.3 中的新Function。

使用给定的* kind *创建一个新的 Unicode 对象(可能的值是PyUnicode_1BYTE_KIND等,由PyUnicode_KIND()返回)。 * buffer 必须指向 size *单位的数组,每个字符由 1、2 或 4 个字节组成,由种类给定。

版本 3.3 中的新Function。

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

如果* u *为NULL,则此函数的行为类似于PyUnicode_FromUnicode(),缓冲区设置为NULL。不推荐使用此用法,而推荐使用PyUnicode_New()

从 UTF-8 编码的以 null 终止的 char 缓冲区* u *创建 Unicode 对象。

使用 C printf()样式的* format 字符串和可变数量的参数,计算所得 Python Unicode 字符串的大小,并返回带有格式化后的值的字符串。变量参数必须是 C 类型,并且必须与 format * ASCII 编码字符串中的格式字符完全对应。允许使用以下格式字符:

Format Characters Type Comment
%% n/a Literals%字符。
%c int 单个字符,表示为 C int。
%d int 等效于printf("%d")[1]
%u unsigned int 等效于printf("%u")[1]
%ld long 等效于printf("%ld")[1]
%li long 等效于printf("%li")[1]
%lu unsigned long 等效于printf("%lu")[1]
%lld long long 等效于printf("%lld")[1]
%lli long long 等效于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 const char* 空终止的 C 字符数组。
%p const void* C 指针的十六进制表示。除平台printf产生什么结果外,它保证以立即数0x开头,因此与printf("%p")基本等效。
%A PyObject* 调用ascii()的结果。
%U PyObject* Unicode 对象。
%V PyObject *,const char * 一个 Unicode 对象(可能是NULL)和一个以空终止的 C 字符数组作为第二个参数(如果第一个参数是NULL,则将使用该数组)。
%S PyObject* 调用PyObject_Str()的结果。
%R PyObject* 调用PyObject_Repr()的结果。

无法识别的格式字符会导致将其余所有格式字符串按原样复制到结果字符串,并丢弃所有多余的参数。

Note

宽度格式器单位是字符数,而不是字节数。精度格式器单位是"%s""%V"的字节数(如果PyObject*参数是NULL),以及"%A""%U""%S""%R""%V"的字符数(如果PyObject*参数不是NULL)。

在版本 3.2 中更改:添加了对"%lld""%llu"的支持。

在版本 3.3 中更改:添加了对"%li""%lli""%zi"的支持。

在版本 3.4 中更改:添加了"%s""%A""%U""%V""%S""%R"的宽度和精度格式化程序。

PyUnicode_FromFormat()相同,除了它只接受两个参数。

将编码对象* obj *解码为 Unicode 对象。

bytesbytearray和其他bytes-like objects根据给定的* encoding 并使用 errors *定义的错误处理进行解码。两者都可以NULL,以使接口使用默认值(有关详细信息,请参见Built-in Codecs)。

所有其他对象(包括 Unicode 对象)都会导致设置TypeError

如果发生错误,API 将返回NULL。调用者负责解密返回的对象。

版本 3.3 中的新Function。

版本 3.3 中的新Function。

如果* fill_char *大于字符串最大字符,或者该字符串具有多个引用,则失败。

返回书写字符数,或返回-1并引发错误异常。

版本 3.3 中的新Function。

此函数检查* unicode *是否为 Unicode 对象,索引是否未超出范围以及是否可以安全地修改该对象(即其引用计数为 1)。

版本 3.3 中的新Function。

版本 3.3 中的新Function。

从字符索引* start (包括)返回字符索引 end (不包括),返回 str *的子字符串。不支持负索引。

版本 3.3 中的新Function。

版本 3.3 中的新Function。

版本 3.3 中的新Function。

不推荐使用的 Py_UNICODE API

从版本 3.3 开始不推荐使用,将在版本 4.0 中删除。

这些 API 函数已在 PEP 393的实现中弃用。扩展模块可以 continue 使用它们,因为它们不会在 Python 3.x 中删除,但是需要注意的是,现在使用扩展模块会导致性能和内存损失。

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

如果缓冲区不是NULL,则返回值可能是共享对象。因此,仅当* u *为NULL时才允许修改所得的 Unicode 对象。

如果缓冲区是NULL,则在使用任何访问宏(例如PyUnicode_KIND())填充字符串内容之后,必须调用PyUnicode_READY()

请迁移到使用PyUnicode_FromKindAndData()PyUnicode_FromWideChar()PyUnicode_New()

请迁移到使用PyUnicode_AsUCS4()PyUnicode_AsWideChar()PyUnicode_ReadChar()或类似的新 API。

从版本 3.3 开始不推荐使用,将在版本 3.10 中删除。

pass将给定* size *的Py_UNICODE缓冲区中的所有十进制数字根据其十进制值替换为 ASCII 数字 0-9,来创建 Unicode 对象。如果发生异常,则返回NULL

版本 3.3 中的新Function。

3.2 版中的新Function。

请迁移到使用PyUnicode_AsUCS4Copy()或类似的新 API。

请迁移到使用PyUnicode_GetLength()

如有必要,将 Unicode 子类型的实例复制到新的真实 Unicode 对象。如果* obj *已经是一个 true 的 Unicode 对象(不是子类型),则以增加的引用计数返回引用。

Unicode 或其子类型以外的对象将导致TypeError

Locale Encoding

当前的语言环境编码可用于解码来自 os 的文本。

从 Android 和 VxWorks 上的 UTF-8 或其他平台上的当前语言环境编码中解码字符串。支持的错误处理程序是"strict""surrogateescape"( PEP 383)。如果* errors *是NULL,则解码器使用"strict"错误处理程序。 * str *必须以空字符结尾,但不能包含嵌入的空字符。

使用PyUnicode_DecodeFSDefaultAndSize()解码来自Py_FileSystemDefaultEncoding的字符串(Python 启动时读取的语言环境编码)。

此函数忽略 Python UTF-8 模式。

See also

Py_DecodeLocale()Function。

版本 3.3 中的新Function。

在 3.7 版中进行了更改:该Function现在还为surrogateescape错误处理程序使用了当前的语言环境编码,但 Android 除外。以前,Py_DecodeLocale()用于surrogateescape,而当前语言环境编码用于strict

PyUnicode_DecodeLocaleAndSize()类似,但是使用strlen()计算字符串长度。

版本 3.3 中的新Function。

在 Android 和 VxWorks 上将 Unicode 对象编码为 UTF-8,在其他平台上则编码为当前的语言环境编码。支持的错误处理程序是"strict""surrogateescape"( PEP 383)。如果* errors *为NULL,则编码器使用"strict"错误处理程序。返回一个bytes对象。 * unicode *不能包含嵌入的空字符。

使用PyUnicode_EncodeFSDefault()将字符串编码为Py_FileSystemDefaultEncoding(在 Python 启动时读取的语言环境编码)。

此函数忽略 Python UTF-8 模式。

See also

Py_EncodeLocale()Function。

版本 3.3 中的新Function。

在 3.7 版中进行了更改:该Function现在还为surrogateescape错误处理程序使用了当前的语言环境编码,但 Android 除外。以前,Py_EncodeLocale()用于surrogateescape,而当前语言环境编码用于strict

文件系统编码

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

3.1 版中的新Function。

在版本 3.6 中更改:接受path-like object

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

3.2 版中的新Function。

在版本 3.6 中更改:接受path-like object

使用Py_FileSystemDefaultEncodingPy_FileSystemDefaultEncodeErrors错误处理程序解码字符串。

如果未设置Py_FileSystemDefaultEncoding,则回退到区域设置编码。

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

See also

Py_DecodeLocale()Function。

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

使用Py_FileSystemDefaultEncodingPy_FileSystemDefaultEncodeErrors错误处理程序解码以 null 结尾的字符串。

如果未设置Py_FileSystemDefaultEncoding,则回退到区域设置编码。

如果您知道字符串的长度,请使用PyUnicode_DecodeFSDefaultAndSize()

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

使用Py_FileSystemDefaultEncodeErrors错误处理程序将 Unicode 对象编码为Py_FileSystemDefaultEncoding,并返回bytes。请注意,生成的bytes对象可能包含空字节。

如果未设置Py_FileSystemDefaultEncoding,则回退到区域设置编码。

Py_FileSystemDefaultEncoding在启动时从区域设置编码初始化,以后无法修改。如果需要将字符串编码为当前的语言环境编码,请使用PyUnicode_EncodeLocale()

See also

Py_EncodeLocale()Function。

3.2 版中的新Function。

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

wchar_t Support

wchar_t对支持它的平台的支持:

从给定* size wchar_t缓冲区 w 创建一个 Unicode 对象。传递-1作为 size *表示该函数本身必须使用 wcslen 计算长度。失败时返回NULL

成功返回PyMem_Alloc()分配的缓冲区(使用PyMem_Free()释放缓冲区)。错误时,返回NULL且** size *未定义。如果内存分配失败,则引发MemoryError

3.2 版中的新Function。

在 3.7 版中进行了更改:如果* size *为NULL并且wchar_t*字符串包含空字符,则引发ValueError

Built-in Codecs

Python 提供了一组内置的编解码器,这些编解码器使用 C 语言编写以提高速度。所有这些编解码器均可pass以下Function直接使用。

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

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

错误处理由错误设置,错误也可以设置为NULL,以使用为编解码器定义的默认处理。所有内置编解码器的默认错误处理为“严格”(引发ValueError)。

编解码器均使用类似的接口。为简单起见,仅记录了与以下通用方法的偏差。

Generic Codecs

这些是通用编解码器 API:

pass解码编码字符串* s size *个字节来创建 Unicode 对象。 * encoding errors 与str()内置函数中具有相同名称的参数具有相同的含义。使用 Python 编解码器注册表查找要使用的编解码器。如果编解码器引发异常,则返回NULL

对 Unicode 对象进行编码,然后将结果作为 Python 字节对象返回。 * encoding errors *与 Unicode encode()方法中具有相同名称的参数具有相同的含义。使用 Python 编解码器注册表查找要使用的编解码器。如果编解码器引发异常,则返回NULL

编码给定* size Py_UNICODE缓冲区 s *并返回一个 Python 字节对象。 * encoding errors *与 Unicode encode()方法中具有相同名称的参数具有相同的含义。使用 Python 编解码器注册表查找要使用的编解码器。如果编解码器引发异常,则返回NULL

从版本 3.3 开始不推荐使用,将在版本 4.0 中删除:老式Py_UNICODE API 的一部分;请迁移到使用PyUnicode_AsEncodedString()

UTF-8 Codecs

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

pass解码 UTF-8 编码字符串* s size *个字节来创建 Unicode 对象。如果编解码器引发异常,则返回NULL

如果* consumed NULL,则表现得像PyUnicode_DecodeUTF8()。如果 consumed 不是NULL,则尾部不完整的 UTF-8 字节序列将不被视为错误。这些字节将不会被解码,并且已解码的字节数将存储在 consumed *中。

使用 UTF-8 编码 Unicode 对象,并将结果作为 Python 字节对象返回。错误处理是“严格的”。如果编解码器引发异常,则返回NULL

如果发生错误,则返回NULL并设置一个 exception,并且不存储* size *。

这会将字符串的 UTF-8 表示形式缓存在 Unicode 对象中,随后的调用将返回一个指向相同缓冲区的指针。调用方不负责取消分配缓冲区。

版本 3.3 中的新Function。

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

版本 3.3 中的新Function。

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

使用 UTF-8 对给定* size Py_UNICODE缓冲区 s *进行编码,并返回一个 Python 字节对象。如果编解码器引发异常,则返回NULL

从版本 3.3 开始不推荐使用,将在版本 4.0 中删除:老式Py_UNICODE API 的一部分;请迁移到使用PyUnicode_AsUTF8String()PyUnicode_AsUTF8AndSize()PyUnicode_AsEncodedString()

UTF-32 Codecs

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

从 UTF-32 编码的缓冲区字符串中解码* size *个字节,然后返回相应的 Unicode 对象。 * errors *(如果不是NULL)定义错误处理。默认为“严格”。

如果* byteorder *不是NULL,则解码器使用给定的字节 Sequences 开始解码:

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

如果*byteorder为零,并且 Importing 数据的前四个字节是字节 Sequences 标记(BOM),则解码器将切换到该字节 Sequences,并且 BOM 不会复制到结果 Unicode 字符串中。如果*byteorder-11,则将任何字节 Sequences 标记复制到输出。

完成后,将** byteorder *设置为 Importing 数据末尾的当前字节 Sequences。

如果* byteorder *为NULL,则编解码器以本机 Sequences 模式启动。

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

如果* consumed NULL,则表现得像PyUnicode_DecodeUTF32()。如果 consumed 不是NULL,则PyUnicode_DecodeUTF32Stateful()不会将尾随不完整的 UTF-32 字节序列(例如,不能被四整除的字节数)视为错误。这些字节将不会被解码,并且已解码的字节数将存储在 consumed *中。

以本地字节 Sequences 使用 UTF-32 编码返回 Python 字节字符串。该字符串始终以 BOM 表标记开头。错误处理是“严格的”。如果编解码器引发异常,则返回NULL

返回一个 Python 字节对象,其中包含* s *中 Unicode 数据的 UTF-32 编码值。根据以下字节 Sequences 写入输出:

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

如果 byteorder 为0,则输出字符串将始终以 Unicode BOM 标记(U FEFF)开头。在其他两种模式下,没有 BOM 标记。

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

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

从版本 3.3 开始不推荐使用,将在版本 4.0 中删除:老式Py_UNICODE API 的一部分;请迁移到使用PyUnicode_AsUTF32String()PyUnicode_AsEncodedString()

UTF-16 Codecs

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

从 UTF-16 编码的缓冲区字符串中解码* size *个字节,然后返回相应的 Unicode 对象。 * errors *(如果不是NULL)定义错误处理。默认为“严格”。

如果* byteorder *不是NULL,则解码器使用给定的字节 Sequences 开始解码:

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

如果*byteorder为零,并且 Importing 数据的前两个字节是字节 Sequences 标记(BOM),则解码器将切换到该字节 Sequences,并且 BOM 不会复制到结果 Unicode 字符串中。如果*byteorder-11,则任何字节 Sequences 标记都将被复制到输出中(它将导致\ufeff\ufffe字符)。

完成后,将** byteorder *设置为 Importing 数据末尾的当前字节 Sequences。

如果* byteorder *为NULL,则编解码器以本机 Sequences 模式启动。

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

如果* consumed NULL,则表现得像PyUnicode_DecodeUTF16()。如果 consumed 不是NULL,则PyUnicode_DecodeUTF16Stateful()不会将尾随不完整的 UTF-16 字节序列(例如,奇数个字节或拆分的代理对)视为错误。这些字节将不会被解码,并且已解码的字节数将存储在 consumed *中。

以本地字节 Sequences 使用 UTF-16 编码返回 Python 字节字符串。该字符串始终以 BOM 表标记开头。错误处理是“严格的”。如果编解码器引发异常,则返回NULL

返回一个 Python 字节对象,该对象保存* s *中 Unicode 数据的 UTF-16 编码值。根据以下字节 Sequences 写入输出:

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

如果 byteorder 为0,则输出字符串将始终以 Unicode BOM 标记(U FEFF)开头。在其他两种模式下,没有 BOM 标记。

如果定义了Py_UNICODE_WIDE,则单个Py_UNICODE值可能表示为代理对。如果未定义,则每个Py_UNICODE值将解释为 UCS-2 字符。

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

从版本 3.3 开始不推荐使用,将在版本 4.0 中删除:老式Py_UNICODE API 的一部分;请迁移到使用PyUnicode_AsUTF16String()PyUnicode_AsEncodedString()

UTF-7 Codecs

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

pass解码 UTF-7 编码字符串* s size *个字节来创建 Unicode 对象。如果编解码器引发异常,则返回NULL

如果* consumed NULL,则表现得像PyUnicode_DecodeUTF7()。如果 consumed 不是NULL,则尾随不完整的 UTF-7 base-64 部分将不被视为错误。这些字节将不会被解码,并且已解码的字节数将存储在 consumed *中。

使用 UTF-7 对给定大小的Py_UNICODE缓冲区进行编码,并返回一个 Python 字节对象。如果编解码器引发异常,则返回NULL

如果* base64SetO 不为零,则将以 base-64 编码“ Set O”(标点没有其他特殊含义)。如果 base64WhiteSpace *不为零,则空格将以 base-64 编码。对于 Python“ utf-7”编解码器,两者都设置为零。

从版本 3.3 开始不推荐使用,将在版本 4.0 中删除:老式Py_UNICODE API 的一部分;请迁移到使用PyUnicode_AsEncodedString()

Unicode-Escape Codecs

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

pass解码 Unicode-Escape 编码字符串* s size *个字节来创建 Unicode 对象。如果编解码器引发异常,则返回NULL

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

使用 Unicode-Escape 编码给定* size *的Py_UNICODE缓冲区,并返回一个字节对象。如果编解码器引发异常,则返回NULL

从版本 3.3 开始不推荐使用,将在版本 4.0 中删除:老式Py_UNICODE API 的一部分;请迁移到使用PyUnicode_AsUnicodeEscapeString()

Raw-Unicode-Escape Codecs

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

pass解码 Raw-Unicode-Escape 编码字符串* s size *个字节来创建 Unicode 对象。如果编解码器引发异常,则返回NULL

使用 Raw-Unicode-Escape 对 Unicode 对象进行编码,然后将结果作为字节对象返回。错误处理是“严格的”。如果编解码器引发异常,则返回NULL

使用 Raw-Unicode-Escape 编码给定* size *的Py_UNICODE缓冲区,并返回一个字节对象。如果编解码器引发异常,则返回NULL

从版本 3.3 开始不推荐使用,将在版本 4.0 中删除:老式Py_UNICODE API 的一部分;请迁移到使用PyUnicode_AsRawUnicodeEscapeString()PyUnicode_AsEncodedString()

Latin-1 Codecs

这些是 Latin-1 编解码器 API:Latin-1 对应于前 256 个 Unicode 序号,只有这些在编解码过程中被编解码器接受。

pass解码 Latin-1 编码字符串* s size *个字节来创建 Unicode 对象。如果编解码器引发异常,则返回NULL

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

使用 Latin-1 编码给定* size *的Py_UNICODE缓冲区,并返回一个 Python 字节对象。如果编解码器引发异常,则返回NULL

从版本 3.3 开始不推荐使用,将在版本 4.0 中删除:老式Py_UNICODE API 的一部分;请迁移到使用PyUnicode_AsLatin1String()PyUnicode_AsEncodedString()

ASCII Codecs

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

pass解码 ASCII 编码字符串* s size *个字节来创建 Unicode 对象。如果编解码器引发异常,则返回NULL

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

使用 ASCII 编码给定* size *的Py_UNICODE缓冲区,并返回一个 Python 字节对象。如果编解码器引发异常,则返回NULL

从版本 3.3 开始不推荐使用,将在版本 4.0 中删除:老式Py_UNICODE API 的一部分;请迁移到使用PyUnicode_AsASCIIString()PyUnicode_AsEncodedString()

字符 Map 编解码器

该编解码器的特殊之处在于,它可用于实现许多不同的编解码器(实际上,这是为了获得encodings软件包中包含的大多数标准编解码器所做的事情)。编解码器使用 Map 来编码和解码字符。提供的 Map 对象必须支持getitem()Map 接口;字典和序列运作良好。

这些是 Map 编解码器 API:

pass使用给定的* mapping 对象解码 s 个编码字符串的 size *个字节来创建 Unicode 对象。如果编解码器引发异常,则返回NULL

如果* mapping NULL,则将应用 Latin-1 解码。其他 mapping *必须将字节序号(0 到 255 范围内的整数)Map 到 Unicode 字符串,整数(然后将其解释为 Unicode 序号)或None。未 Map 的数据字节–导致LookupError的字节以及 Map 到None0xFFFE'\ufffe'的字节均被视为未定义的 Map,并导致错误。

使用给定的* mapping *对象对 Unicode 对象进行编码,然后将结果作为字节对象返回。错误处理是“严格的”。如果编解码器引发异常,则返回NULL

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

从版本 3.3 开始不推荐使用,将在版本 4.0 中删除:老式Py_UNICODE API 的一部分;请迁移到使用PyUnicode_AsCharmapString()PyUnicode_AsEncodedString()

以下编解码器 API 的特殊之处在于它将 UnicodeMap 到 Unicode。

使用给定的* mapping *对象转换 Unicode 对象并返回生成的 Unicode 对象。如果编解码器引发异常,则返回NULL

pass向其应用字符* mapping 表来转换给定 size *的Py_UNICODE缓冲区,并返回生成的 Unicode 对象。当编解码器引发异常时,返回NULL

从版本 3.3 开始不推荐使用,将在版本 4.0 中删除:老式Py_UNICODE API 的一部分;请迁移到使用PyUnicode_Translate()。或基于通用编解码器的 API

Windows MBCS 编解码器

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

pass解码 MBCS 编码字符串* s size *个字节来创建 Unicode 对象。如果编解码器引发异常,则返回NULL

如果* consumed NULL,则表现得像PyUnicode_DecodeMBCS()。如果 consumed 不是NULL,则PyUnicode_DecodeMBCSStateful()将不会解码尾随前导字节,并且已解码的字节数将存储在 consumed *中。

使用 MBCS 对 Unicode 对象进行编码,然后将结果作为 Python 字节对象返回。错误处理是“严格的”。如果编解码器引发异常,则返回NULL

使用指定的代码页对 Unicode 对象进行编码,然后返回一个 Python 字节对象。如果编解码器引发异常,则返回NULL。使用CP_ACP代码页获取 MBCS 编码器。

版本 3.3 中的新Function。

使用 MBCS 编码给定* size *的Py_UNICODE缓冲区,并返回一个 Python 字节对象。如果编解码器引发异常,则返回NULL

从版本 3.3 开始不推荐使用,将在版本 4.0 中删除:老式Py_UNICODE API 的一部分;请迁移到使用PyUnicode_AsMBCSString()PyUnicode_EncodeCodePage()PyUnicode_AsEncodedString()

方法和插槽

方法和插槽Function

以下 API 能够处理 Importing 时的 Unicode 对象和字符串(我们在描述中将它们称为字符串),并适当地返回 Unicode 对象或整数。

如果发生异常,它们都返回NULL-1

Concat 提供了一个新的 Unicode 字符串的两个字符串。

拆分一个字符串,以提供 Unicode 字符串列表。如果* sep NULL,则将在所有空白子字符串处进行拆分。否则,将在给定的分隔符处发生拆分。最多将 maxsplit *个分割完成。如果为负,则未设置限制。分隔符不包括在结果列表中。

在换行符处拆分 Unicode 字符串,返回 Unicode 字符串列表。 CRLF 被认为是一个换行符。如果* keepend *为0,则换行符不包含在结果字符串中。

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

Map 表只需要提供getitem()接口;字典和序列运作良好。未 Map 的字符序号(导致LookupError的字符序号)保持不变,并按原样复制。

错误对于编解码器具有通常的含义。可能是NULL,表示使用默认错误处理。

使用给定的分隔符连接字符串序列,并返回结果 Unicode 字符串。

版本 3.3 中的新Function。

在版本 3.7 中更改:现在将* start end *调整为类似于str[start:end]

用* replstr 最多替换 str substr maxcount *次,并返回生成的 Unicode 对象。 * maxcount * == -1表示替换所有匹配项。

该函数在失败时返回-1,因此应该调用PyErr_Occurred()来检查错误。

此函数不会引发异常。

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

从* format args *返回一个新的字符串对象;这类似于format % args

PyUnicode_FromString()PyUnicode_InternInPlace()的组合,返回已被嵌入的新 Unicode 字符串对象,或返回对具有相同值的先前被嵌入的字符串对象的新(“拥有”)引用。

首页