Unicode对象和编解码器

Unicode对象

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

Py_UNICODE*和UTF-8表示按需创建并在Unicode对象中缓存。Py_UNICODE*表示被弃用且效率低下;在性能或记忆敏感的情况下应该避免它.

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

  • “规范”unicode对象是由非deprecatedunicode API创建的所有对象。他们使用实现所允许的最有效的表示.
  • “遗留”unicode对象是通过其中一个已弃用的API(通常为PyUnicode_FromUnicode())创建的,只承载Py_UNICODE*表示;你将不得不打电话PyUnicode_READY()在调用任何其他API之前对它们进行操作.

Unicode类型

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

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

3.3版本中的新功能

Py_UNICODE
这是wchar_t,这是一个16位型或32位型,取决于平台.

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

PyASCIIObject
PyCompactUnicodeObject
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
如果对象o是Unicode对象或Unicodesubtype的实例,则返回true
//int PyUnicode_CheckExact PyObject  *o
如果对象o是Unicode对象,但不是asubtype的实例,则返回true.
int PyUnicode_READY PyObject  *o
确保字符串对象o在“规范”中“代表。这是在使用下面描述的任何访问宏之前需要的.

回复0成功和-1失败时设置异常,如果内存分配失败则会发生特殊情况.

版本3.3.

Py_ssize_t PyUnicode_GET_LENGTH PyObject  *o
在代码点中返回Unicode字符串的长度。o必须是“规范”表示中的aUnicode对象(未选中).

版本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或UCS4integer类型的规范表示的指针,以便直接进行字符访问。如果规范表示具有正确的字符大小,则不执行检查;使用PyUnicode_KIND()选择正确的宏。确保PyUnicode_READY()在访问之前已被调用.

新版本3.3.

PyUnicode_WCHAR_KIND
PyUnicode_1BYTE_KIND
PyUnicode_2BYTE_KIND
PyUnicode_4BYTE_KIND
返回PyUnicode_KIND()宏的值

3.3版本中的新功能

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

版本3.3.

void* PyUnicode_DATA PyObject  *o
返回一个指向原始unicode缓冲区的void指针。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的PyObject  *o
返回适合于创建另一个基于o,必须采用“规范”表示。这总是近似但比在字符串上迭代更有效.

新版本3.3.

int PyUnicode_ClearFreeList
清除免费列表。返回已释放物品的总数.
Py_ssize_t PyUnicode_GET_SIZE的PyObject  *o
返回已弃用的Py_UNICODE表示,incode单位(这包括代理对作为2个单位)。o必须是aUnicode对象(未选中).

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

Py_ssize_t PyUnicode_GET_DATA_SIZE PyObject  *o
返回已弃用的Py_UNICODE表示inbytes的大小。o必须是一个Unicode对象(未选中).

从版本3.3开始不推荐使用,将在版本4.0中删除:部分旧式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().

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

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
根据是否1返回0ch是一个可打印的字符。不可打印的字符是Unicode字符数据库中定义为“其他”或“分隔符”的字符,但ASCII空格(0x20)除外,它被认为是可打印的。(请注意,此上下文中的可打印字符是repr()在字符串上调用。它与写入sys.stdoutsys.stderr的字符串的处理没有关系.

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

Py_UNICODE Py_UNICODE_TOLOWERPy_UNICODE  ch
返回字符ch转换为小写字母.

自版本3.3以后删除:此函数使用简单的大小写mappings.

Py_UNICODE Py_UNICODE_TOUPPER Py_UNICODE  ch
返回字符ch转换为大写字母.

自版本3.3以后删除:此函数使用简单的大小写映射.

Py_UNICODE Py_UNICODE_TOTITLE Py_UNICODE  ch
返回字符ch转换为标题case

//自版本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_SURROGATECH
检查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(高,低
加入两个代理字符并返回单个Py_UCS4值.highlow分别是asurrogate对中的前导和尾随代理.

创建和访问Unicode字符串

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

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

创建一个新的Unicode对象。maxchar应该是放在字符串中的真正的最大代码点。作为近似值,它可以向上舍入到序列127,255,65535,1114111中的最近值.

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

版本3.3.

PyObject* PyUnicode_FromKindAndData int  kindconst void *buffer,Py_ssize_t  size
Return value: New reference.

使用给定的kind(可能的值是PyUnicode_1BYTE_KIND等,由PyUnicode_KIND())。buffer必须指向一个size每个字符单位为1,2或4个字节,由种类给出.

新版本3.3.

PyObject* PyUnicode_FromStringAndSize constchar  *u,Py_ssize_t  size
Return value: New reference.

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

如果uNULL,此函数的行为类似于PyUnicode_FromUnicode(),缓冲区设置为NULL。这个用法不赞成使用PyUnicode_New().

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

从UTF创建一个Unicode对象-8编码的以null结尾的char缓冲区u.

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

取一个C printf() – 样式format字符串和可变数量的参数,计算生成的Python unicode字符串的大小,并返回格式化为其值的returna字符串。变量参数必须是Ctypes,并且必须与format ASCII编码字符串中的格式字符完全对应。允许使用以下格式字符:

格式字符 键入 注释
%% n/a 文字%字符
%c int 单个字符,表示为C int.
%d int 等于printf("%d")。[1]
%u unsigned int 相当于printf("%u")。[1]
%ld 相当于printf("%ld")。[1]
%li 相当于printf("%li")。[1]
%lu unsigned long 相当于printf("%lu")。[1]
%lld 很长 相当于printf("%lld")。[1]
%lli 很长 相当于printf("%lli")。[1]
%llu unsigned long long 相当于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 * 以null结尾的C characterarray.
%p const void * Cpointer的十六进制表示。大部分相当于printf("%p")除了保证以字面0x开头,无论平台的printf yields.
%A PyObject* 调用的结果ascii().
%U PyObject * 一个unicode对象.
%V PyObject *,const char * 一个unicode对象(可能是NULL)和一个null-terminatedC字符数组作为第二个参数(如果第一个参数是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_FromFormatVconst 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对象.

bytes, bytearray和别的字节对象根据给定的解码encoding并使用errors。两者都可以NULL让接口使用defaultvalues(详见内置编解码器).

所有其​​他对象,包括Unicode对象,导致TypeError beset.

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对象复制到另一个Unicode对象。此功能在必要时执行字符转换,并且如果可能则回退到memcpy()。返回-1并在出错时设置异常,否则返回复制字符数.

新版本3.3.

Py_ssize_t PyUnicode_Fill PyObject  *unicode,Py_ssize_t  start,Py_ssize_t  length,Py_UCS4  fill_char
用字符填充字符串:写fill_char进入unicode[start:start+length].

如果fill_char大于字符串最大字符,或者如果字符串超过1个引用,则失败.

返回写入字符的数量,或者返回-1并在出错时引发异常.

新版本3.3.

int PyUnicode_WriteChar PyObject  *unicode,Py_ssize_t  index,Py_UCS4  character
在字符串中写一个字符。该字符串必须是通过PyUnicode_New()创建的。因为Unicode字符串应该是不可变的,所以字符串不能被共享,或者已经被哈希化了

这个函数检查unicode是一个Unicode对象,索引不会超出范围,并且可以安全地修改对象(即引用计数是一个).

版本3.3中的新内容.

Py_UCS4 PyUnicode_ReadChar PyObject  *unicode,Py_ssize_t  index
从字符串中读取一个字符。此函数检查unicode是aUnicode对象并且索引不是超出界限,与版本3.3中的宏转换PyUnicode_READ_CHAR().

新建相反.

PyObject* PyUnicode_Substring PyObject  *str,Py_ssize_t  start,Py_ssize_t  end
Return value: New reference.

返回str的子字符串,从字符索引start(包括)tocharacter index end(除外)。不支持负指数.

版本3.3.

Py_UCS4 * PyUnicode_AsUCS4 PyObject  *u,Py_UCS4  *buffer,Py_ssize_t  buflen,int  copy_null
将字符串u复制到UCS4缓冲区中,包括空字符,如果copy_null已设置。返回NULL并在出错时设置异常(特别是SystemError如果buflen小于u的长度)。buffer成功归还

新的版本3.3.

Py_UCS4* PyUnicode_AsUCS4Copy PyObject  *u
复制字符串u到使用PyMem_Malloc()。如果失败了,NULLMemoryError组。返回的缓冲区总是附加一个外部代码点

3.3版本中的新功能

不推荐使用的Py_UNICODE API

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

执行PEP 393 .Extension模块可以继续使用它们,因为它们不会在Python3.x中删除,但需要注意它们的使用现在可以导致性能和内存命中.

PyObject* PyUnicode_FromUnicodeconst Py_UNICODE  *u,Py_ssize_t  size
Return value: New reference.

从给定大小的Py_UNICODE缓冲区u创建一个Unicode对象。u也许 NULL这导致内容未定义。用户有责任填写所需数据。缓冲区被复制到newobject.

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

时才允许修改生成的Unicode对象。如果缓冲区是NULL, PyUnicode_READY()必须在字符串后调用在使用任何访问宏之前已经填充了内容,例如PyUnicode_KIND().

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

Py_UNICODE * PyUnicode_AsUnicode PyObject  *unicode
返回一个只读指向Unicode对象的内部Py_UNICODE缓冲区,或NULL出错。如果对象尚不可用,这将创建对象的Py_UNICODE*表示。缓冲区总是以一个额外的空代码点终止。注意结果Py_UNICODE字符串也可能包含嵌入空代码点,这会导致在大多数C函数中使用时字符串被截断.

请迁移到使用PyUnicode_AsUCS4(),PyUnicode_AsWideChar(), PyUnicode_ReadChar()或类似的newAPIs.

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

通过替换给定Py_UNICODEsize按ASCII数字0-9按照其十进制值。返回NULL如果发生异常.

Py_UNICODE * PyUnicode_AsUnicodeAndSize的PyObject  *unicode,Py_ssize_t  *size
喜欢 PyUnicode_AsUnicode(),还要保存Py_UNICODE()中的数组长度(不包括额外的空终止符)size。注意结果Py_UNICODE*stringmay包含嵌入的空代码点,当在大多数C函数中使用时会导致字符串被截断.

版本3.3.

Py_UNICODE* PyUnicode_AsUnicodeCopy的PyObject  *unicode
创建以空代码点结尾的Unicode字符串的副本。返回NULL并在内存分配失败时引发MemoryError异常,否则返回一个新分配的缓冲区(使用PyMem_Free()到freethe缓冲区)。请注意,生成的Py_UNICODE*字符串可能包含嵌入的空代码点,这会导致字符串在大多数C函数中使用时被截断.

新版本3.2.

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

Py_ssize_t PyUnicode_GetSize PyObject  *unicode
返回被弃用的大小Py_UNICODE表示,incode单位(这包括代理对作为2个单位).

请迁移到使用PyUnicode_GetLength().

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

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

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

语言环境编码

当前语言环境编码可用于解码操作系统中的文本.

PyObject* PyUnicode_DecodeLocaleAndSizeconst char  *str,Py_ssize_t  len,const char  *errors
Return value: New reference.

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

使用 PyUnicode_DecodeFSDefaultAndSize()从解码一个字符串Py_FileSystemDefaultEncoding(locale编码读取atPython启动).

此函数忽略了Python UTF-8模式.

也可以看看

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(),但是计算stringlength使用strlen().

版本3.3.

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

在Android上将Unicode对象编码为UTF-8,或在其他平台上编码当前的localeencoding。支持的错误处理程序是"strict""surrogateescape" PEP 383 )。编码器使用"strict"错误处理程序,如果errorsNULL。返回bytes对象。unicode无法包含嵌入的空字符.

使用PyUnicode_EncodeFSDefault()将字符串编码为Py_FileSystemDefaultEncoding(语言环境编码读取atPython启动时).

此函数忽略了Python UTF-8模式.

也可以看看

Py_EncodeLocale()功能。

3.3版本中的新功能

更改版本3.7:该函数现在还使用surrogateescape错误处理程序的当前语言环境编码,Android上除外。以前,Py_EncodeLocale()用于surrogateescape,当前的语言环境编码用于strict.

文件系统编码

要编码和解码文件名和其他环境字符串,Py_FileSystemDefaultEncoding应该用作编码,Py_FileSystemDefaultEncodeErrors应该用作错误处理程序(PEP 383 PEP 529 )。要将文件名编码为bytes在分析过程中,应该使用"O&amp;"转换器,传递PyUnicode_FSConverter()作为转换函数:

int PyUnicode_FSConverter PyObject *  obj,void *  result
ParseTuple转换器:编码str对象 – 直接通过os.PathLike接口获得 – 使用bytesPyUnicode_EncodeFSDefault();bytes对象输出as-is.result必须是PyBytesObject*必须在不再使用时释放.

3.1版本中的新版

在版本3.6中更改:接受路径对象.

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

int PyUnicode_FSDecoder PyObject *  obj,void *  result
ParseTuple转换器:解码bytes对象 – 通过os.PathLike接口直接或间接获得 – 使用strPyUnicode_DecodeFSDefaultAndSize();str对象按原样输出。result必须是PyUnicodeObject*必须在不再使用的时候发布.

新版本3.2.

更改版本3.6:接受路径状物体.

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

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

如果没有设置Py_FileSystemDefaultEncoding,则回退到编码.

Py_FileSystemDefaultEncoding在初始化时从thelocale编码初始化,以后不能修改。如果你需要解码当前语言环境编码的字符串,请使用PyUnicode_DecodeLocaleAndSize().

参见

Py_DecodeLocale()功能

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

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

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

如果Py_FileSystemDefaultEncoding没有设置,回到thelocale编码.

使用 PyUnicode_DecodeFSDefaultAndSize()如果你知道字符串长度

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

PyObject * PyUnicode_EncodeFSDefault的PyObject  *unicode
Return value: New reference.

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

如果Py_FileSystemDefaultEncoding没有设置,回退到thelocale编码.

Py_FileSystemDefaultEncoding在启动时从thelocale编码初始化,以后不能修改。如果需要将字符串编码为当前的语言环境编码,请使用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.

从给定wchar_tw缓冲区size创建一个Unicode对象.Passing -1因为size表示函数本身必须计算长度,使用wcslen.Return 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*字符串以空值终止是callerto的责任。另请注意,wchar_t* stringmight包含空字符,这会导致字符串在与大多数C函数一起使用时被截断.
wchar_t* PyUnicode_AsWideCharString PyObject  *unicode,Py_ssize_t  *size
将Unicode对象转换为宽字符串。输出stringalways以空字符结尾。如果size是不是NULL,将宽字符数(不包括尾随空终止字符)写入*size。注意结果wchar_tstring可能包含空字符,这会导致在与大多数C函数一起使用时截断字符串。如果sizeNULLwchar_t*stringcontains null characters a ValueError被养了

返回成功时由PyMem_Alloc()分配的缓冲区(使用PyMem_Free()释放它)。出错,返回NULL*size未定义。如果内存分配失败,则提高MemoryError .

版本3.2.

更改版本3.7:如果ValueErrorsize并且NULL字符串包含空字符,则引发wchar_t*.

 

内置编解码器

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

以下许多API都有两个参数编码和错误,它们与内置的str()字符串objectconstructor具有相同的语义.

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

错误处理由错误设置,错误也可以设置为NULL意思是使用为编解码器定义的默认处理。所有内置编解码器的默认错误处理都是“严格”(ValueError被提出来.

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

通用编解码器

这些是通用的编解码器API:

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

通过解码编码字符串的size字节来创建一个Unicode对象s.encodingerrorsstr()内置函数中的同名参数含义相同。使用Python编解码器注册表查找要使用的编解码器。返回NULL如果编解码器引发异常.

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

对Unicode对象进行编码并将结果作为Python字节对象返回.encodingerrors的含义与Unicode encode()方法中同名的参数。使用Python编解码器注册表查找要使用的编解码器。返回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并返回一个Pythonbytes对象。encodingerrors与Unicode encode()方法中的同名参数具有相同的含义。使用Python编解码器注册表查找使用的codecto。返回NULL如果编解码器引发了异常。

自版本3.3以后删除,将在版本4.0中删除:部分旧版Py_UNICODE API;请迁移到使用PyUnicode_AsEncodedString().

UTF-8编解码器

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

PyObject * PyUnicode_DecodeUTF8const char  *s,Py_ssize_t  size,const char  *errors
Return value: New reference.

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

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

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

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

使用UTF-8编码Unicode对象并将结果作为Python bytesobject返回。错误处理是“严格的”。返回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 *.

const char * PyUnicode_AsUTF8 PyObject  *unicode
作为PyUnicode_AsUTF8AndSize(),但不存储尺寸.

新版本3.3.

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

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

编码Py_UNICODE缓冲s的给定size使用UTF-8并返回一个Python字节对象。返回NULL如果编解码器引发了异常.

自版本3.3以后删除,将在版本4.0中删除:部分旧版Py_UNICODEAPI;请迁移到使用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对象。errors(如果不是NULL)定义错误处理。它默认为“严格”.

如果byteorder不是NULL,解码器使用给定的byteorder开始解码:

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

如果*byteorder为零,并且输入数据的前四个字节是abyte顺序标记(BOM),解码器切换到此字节顺序,并且BOM不会复制到生成的Unicode字符串中。如果*byteorder-1要么1,任何字节顺序标记都被复制到输出中.

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

如果byteorderNULL编解码器以本机顺序模式启动.

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

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

如果consumedNULL,就像PyUnicode_DecodeUTF32()。如果consumed不是NULL, PyUnicode_DecodeUTF32Stateful()不会将不完整的UTF-32字节序列(例如不能被4整除的字节数)作为错误处理。这些字节不会被解码,已解码的字节数将存储在consumed.

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

使用本机byteorder中的UTF-32编码返回一个Python字节字符串。该字符串始终以BOM标记开头。错误处理是“严格的”。返回NULL如果编解码器引发了异常.

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

返回一个Python字节对象,其中包含s中的Unicodedata的UTF-32编码值。输出按以下字节顺序写入:

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

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

如果Py_UNICODE_WIDE没有定义,代理对将作为单个代码点输出.

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

自版本3.3以来已删除,将被删除在版本4.0:部分旧式Py_UNICODE API;请迁移到使用PyUnicode_AsUTF32String()PyUnicode_AsEncodedString().

UTF-16编解码器

这些是UTF-16编解码器API

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

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

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

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

如果*byteorder为零,并且输入数据的前两个字节是abyte顺序标记(BOM),解码器切换到此字节顺序,并且BOM不会复制到生成的Unicode字符串中。如果*byteorder-11,任何字节顺序标记都被复制到输出中(无论是\ufeff还是\ufffe字符都会产生).

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

如果byteorderNULL编解码器以本机顺序模式启动.

返回NULL如果编解码器引发了例外情况

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

如果consumedNULL,表现得像PyUnicode_DecodeUTF16()。如果consumed不是NULL, PyUnicode_DecodeUTF16Stateful()将不会将不完整的UTF-16字节序列(例如奇数个字节或asplit代理对)作为错误处理。这些字节不会被解码,已解码的字节数将存储在consumed.

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

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

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

返回一个Python字节对象,其中包含Unicodedata的UTF-16编码值s。输出按以下字节顺序写入:

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

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

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

返回NULL如果编解码器引发了例外情况

从版本3.3开始不推荐使用,将在4.0版本中删除:部分旧式Py_UNICODEAPI;请迁移到使用PyUnicode_AsUTF16String()PyUnicode_AsEncodedString().

UTF-7编解码器

这些是UTF-7编解码器API

PyObject * PyUnicode_DecodeUTF7 const char  *s,Py_ssize_t  sizeconst char  *errors
Return value: New reference.

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

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

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

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

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

如果base64SetO非零,“Set O”(没有其他特殊含义的标点符号)将在base-64中编码。如果base64WhiteSpace是isnonzero,则空格将以base-64编码。对于thePython“utf-7”编解码器,两者都设置为零.

自版本3.3以来,已删除,将在版本4.0中删除:部分旧版Py_UNICODEAPI;请迁移到使用PyUnicode_AsEncodedString().

Unicode-Escape Codecs

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

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

通过解码size字节的Unicode来创建一个Unicode对象逃脱编码串s。返回NULL如果编解码器引发异常.

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

使用Unicode-Escape对Unicode对象进行编码,并将结果作为abytes对象返回。错误处理是“严格的”。返回NULL如果编解码器提出例外情况

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

编码给定的Py_UNICODE缓冲区size使用Unicode-Escape并返回一个bytes对象。返回NULL如果编解码器引发了例外情况

从版本3.3开始不推荐使用,将在4.0版本中删除:部分旧式Py_UNICODEAPI;请迁移到使用PyUnicode_AsUnicodeEscapeString().

Raw-Unicode-Escape编解码器

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

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

通过解码原始Unicode-Escapeencoded字符串sizes字节来创建Unicode对象。返回NULL如果编解码器引发异常.

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

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

PyObject* PyUnicode_EncodeRawUnicodeEscapeconst Py_UNICODE  *s,Py_ssize_t  size
Return value: New reference.

编码Py_UNICODE给定缓冲区size使用Raw-Unicode-Escapeand返回一个bytes对象。返回NULL如果编解码器引发了例外情况

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

Latin-1 Codecs

这些是Latin-1编解码器API:Latin-1对应于前256个Unicodeordinals,并且只有这些在编码期间被编解码器接受.

PyObject* PyUnicode_DecodeLatin1const char  *s,Py_ssize_t  size,const char  *errors
Return value: New reference.

通过解码size拉丁文-1编码字符串s的字节来创建一个Unicode对象。返回NULL如果编解码器引发异常则

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

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

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

使用Latin-1编码给定Py_UNICODEsize缓冲区并返回一个Python字节对象。返回NULL如果编解码器引发了异常.

自版本3.3以后删除,将在版本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.

通过解码ASCII编码字符串sizes字节来创建一个Unicode对象。返回NULL如果编解码器引发异常.

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

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

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

使用ASCII编码给定Py_UNICODEsize缓冲区并返回Python字节对象。返回NULL如果编解码器引发了异常.

自版本3.3以后删除,将在版本4.0中删除:部分旧版Py_UNICODE API;请迁移到使用PyUnicode_AsASCIIString()PyUnicode_AsEncodedString().

字符映射编解码器

这个编解码器的特殊之处在于它可用于实现许多不同的编解码器(这实际上是做了什么获取encodings包中包含的大部分标准codecs。编解码器使用映射来编码和解码字符。提供的映射对象必须支持__getitem__()映射接口;字典和序列工作得很好

这些是映射编解码器API:

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

通过使用给定的size解码编码字符串smapping宾语。返回NULL如果编解码器引发异常.

如果mappingNULL,将应用Latin-1解码。其他mapping必须将字节序数(0到255范围内的整数)映射到Unicode字符串,整数(然后解释为Unicodeordinals)或None。未映射的数据字节 – 导致LookupError,以及映射到None,0xFFFE"\ufffe"的那些被视为未定义的映射并导致错误.

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

使用给定的mapping对象对Unicode对象进行编码,并将结果作为字节对象返回。错误处理是“严格的”。如果编解码器提出异常,请返回NULL

mapping对象必须将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的缓冲区使用给定的mapping对象并将结果作为字节对象返回。返回NULL如果编解码器引发了异常。

自版本3.3以后删除,将在版本4.0中删除:部分旧版Py_UNICODE API;请迁移到使用PyUnicode_AsCharmapString()PyUnicode_AsEncodedString().

以下编解码器API特别适用于将Unicode映射到Unicode.

PyObject* PyUnicode_Translate PyObject  *unicode,PyObject  *mapping,const char  *errors
Return value: New reference.

使用给定的mapping对象翻译Unicode对象并返回结果Unicode宾语。返回NULL如果编码引起异常

mappingobject必须将Unicode序数整数映射到Unicode字符串,整数(然后解释为Unicode序数)或None(导致删除字符)。未映射的字符序号(导致LookupError的字符)保持不变并被复制为-is.

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

翻译给定的Py_UNICODE缓冲区size通过将acharacter mapping表应用于它并返回生成的Unicode对象。当编解码器引发异常时返回NULL

自版本3.3以来已删除,将在版本4.0中删除:部分旧式Py_UNICODE API;请转移到使用PyUnicode_Translate()。或基于通用编解码器的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.

如果consumedNULL,就像PyUnicode_DecodeMBCS()。如果consumed是不是NULL, PyUnicode_DecodeMBCSStateful()不会解码引导字节,已经解码的字节数将被存储在consumed.

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

使用MBCS对Unicode对象进行编码,并将结果作为Python bytesobject返回。错误处理是“严格的”。返回NULL如果编解码器提出例外情况

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

编码Unicode对象使用指定的代码页并返回Pythonbytes对象。如果编解码器引发异常,则返回NULL。使用CP_ACP代码页获取MBCS编码器.

新版本3.3.

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

使用MBCS编码给定Py_UNICODEsize缓冲区returna Python字节对象。返回NULL如果codec.

引发异常,则自版本3.3以后删除,将在版本4.0中删除:部分旧版Py_UNICODE API;请迁移到使用PyUnicode_AsMBCSString(), PyUnicode_EncodeCodePage()PyUnicode_AsEncodedString().

方法&amp;插槽

 

方法和插槽函数

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

如果发生异常,他们都会NULL-1返回.

PyObject* PyUnicode_ConcatPyObject  *left,PyObject  *right
Return value: New reference.

Concat两个字符串给出一个新的Unicode字符串.

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

拆分一个字符串,给出一个Unicode字符串列表。如果sepNULL,则拆分将在所有空格子串中完成。否则,拆分发生在给定的分隔符处。最多maxsplit分裂将完成。如果是否定的,则没有限制。分隔符不包含在结果列表中.

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

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

PyObject* PyUnicode_Translate PyObject  *str,PyObject  *table,const char  *errors
通过对字符串应用字符映射表来转换字符串并返回结果的Unicode对象.

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

映射表只需要提供__getitem__()接口;字典和序列运作良好。未映射的字符序号(导致LookupError)没有被触及并被复制as-is.

errors具有编解码器的通常含义。它可能是NULL表示默认错误处理.

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

使用给定的separator加入一串字符串并返回得到的Unicode字符串.

Py_ssize_t PyUnicode_Tailmatch PyObject  *str,PyObject  *substr,Py_ssize_t  start,Py_ssize_t  end,int  direction
返回1如果substr在给定的尾端匹配str[start:end]direction == -1表示做前缀匹配,direction == 1后缀匹配),0否则。返回-1如果发生了错误.
Py_ssize_t PyUnicode_Find PyObject  *str,PyObject  *substr,Py_ssize_t  start,Py_ssize_t end,int  direction
使用给定的substrstr[start:end]的第一个位置返回到directiondirection== 1意思是进行前向搜索,direction == -1 abackward search)。返回值是第一个匹配的索引;值-1表示未找到匹配项,-2表示发生了错误并且已设置异常.
Py_ssize_t PyUnicode_FindChar PyObject  *str,Py_UCS4  ch,Py_ssize_t  start,Py_ssize_t  end,int  direction
使用给定的chstr[start:end] == direction表示进行前向搜索,返回direction1中的第一个位置direction == -1向后搜索)。返回值是第一次匹配的索引;值-1表示未找到匹配项,-2表示发生错误且已设置异常.

3.3版本中新增了

//在版本3.7中更改:startend现在调整为像str[start:end].

Py_ssize_t PyUnicode_Count PyObject  *str,PyObject  *substr,Py_ssize_t  start,Py_ssize_t  end
返回substr非重叠出现的次数str[start:end]。返回-1如果发生错误
PyObject * PyUnicode_Replace的PyObject  *str,PyObject  *substr,PyObject  *replstr,Py_ssize_t  maxcount
Return value: New reference.

最多更换maxcount发生substrstrreplstr并返回生成的Unicode对象。maxcount == -1表示替换alloccurrences.

int PyUnicode_Compare PyObject  *left,PyObject  *right
比较两个字符串并返回-1, 0, 1小于,等于,大于,分别.

这个函数在失败时返回-1,所以应该调用PyErr_Occurred()来检查错误.

int PyUnicode_CompareWithASCIIString PyObject  *uni,const char  *string
比较一个unicode对象,unistring并返回-1, 0, 1分别小于,等于和大于。最好只传递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以防类型组合未知

op的可能值是Py_GT, Py_GE, Py_EQ,Py_NE, Py_LTPy_LE.

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

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

int PyUnicode_Contains PyObject  *container,PyObject  *element
检查//是否element包含在container中并且相应地返回true或false。

element必须强制转换为单元素的Unicode字符串。-1如果出现错误则返回

避免PyUnicode_InternInPlace PyObject  **string
实习生*string 到位。参数必须是指向Python unicode字符串对象的apointer变量的地址。如果有一个与*string相同的实际字符串,则设置*stringtoit(递减旧字符串对象的引用计数并递增实习字符串对象的引用计数),否则它将单独留下*string并实例化(增加其引用计数)。(澄清:即使有一个很多关于引用计数的讨论,认为这个函数是引用计数中性的;你在callif之后拥有该对象,并且只有在调用之前拥有它。)
PyObject * PyUnicode_InternFromString const char  *v
Return value: New reference.

PyUnicode_FromString()PyUnicode_InternInPlace()的组合,返回一个已被实习的新unicode stringobject,或者对具有相同值的较早的字符串对象的新(“拥有”)引用.

评论被关闭。