可以在Python扩展对象中使用widecharacter成员吗?

2024-09-28 01:26:08 发布

您现在位置:Python中文网/ 问答频道 /正文

使用PyMemberDef声明中的T_STRING定义,在Python C扩展中为基类型为char *的对象创建成员非常简单。在

为什么wchar_t *似乎没有等价物?如果真的有,那是什么?在

例如

struct object包含char *text

PyMemberDef数组有{"text", T_STRING, offsetof(struct object, text), READONLY, "This is a normal character string."}

和类似的

struct object包含wchar_t *wtext

PyMemberDef数组有{"wtext", T_WSTRING, offsetof(struct object, wtext), READONLY, "This is a wide character string"}

我知道像PyUnicode_AsString()之类的东西和它的相关方法可以用UTF-8对数据进行编码,将其存储在一个基本的字符串中,稍后再进行解码,但是这样做需要将泛型的getattr和{}方法/函数包装为说明编码文本的方法/函数,如果你想在一个结构中使用固定元素大小的字符数组,又不希望存储在其中的有效字符数发生变化,那么这种方法就不太有用了。在


Tags: 方法textstringobjectis数组thisstruct
1条回答
网友
1楼 · 发布于 2024-09-28 01:26:08

直接使用wchar_t是不可移植的。相反,Python将^{} type定义为Unicode字符的存储单元。在

根据平台的不同,Py_UNICODE可以定义为wchar_t(如果可用),也可以定义为无符号的short/integer/long,其宽度取决于Python的配置方式(UCS2与UCS4)以及使用的体系结构和C编译器。您可以在^{}中找到相关定义。在

对于您的用例,您的对象可以有一个Unicode字符串的属性,使用T_OBJECT

static struct PyMemberDef attr_members[] = {
  { "wtext", T_OBJECT, offsetof(PyAttrObject, wtext), READONLY, "wide string"}
  ...

可以在对象的初始值设定项中执行类型检查:

^{pr2}$

如果需要迭代Unicode字符串中的低级字符,有一个宏返回Py_UNICODE *

int i = 0;
Py_ssize_t size = PyUnicode_GetSize(self->wtext);
Py_UNICODE *chars = PyUnicode_AS_UNICODE(self->wtext);
for (i = 0; i < size; i++) {
    // use chars[i]
    ...

相关问题 更多 >

    热门问题