【问题标题】:Possible to use wide-character members in Python extension objects?可以在 Python 扩展对象中使用宽字符成员吗?
【发布时间】:2011-09-05 19:04:48
【问题描述】:

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

为什么似乎没有 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 编码数据,将其存储在基本字符字符串中,然后再解码,但这样做需要包装通用 @ 987654334@ 和 setattr 方法/函数与那些解释编码文本的方法/函数,当您想要结构中固定元素大小的字符数组并且不想要可以存储的有效字符数时,它不是很有用它会有所不同。

【问题讨论】:

  • 我不知道这是否回答了您的问题,但是:根据 Python 的编译方式,Py_UNICODE 可能是 wchar_t。 Python 可以为每个 unicode 字符(即 wchar)使用 2 个字节,也可以使用 4 个字节。因此 C 代码需要使用 PyUnicode_* 函数来处理 unicode 字符串,而无需假设它们存储的格式。
  • @Thomas: wchar_t 是两个或四个字节,具体取决于平台。

标签: python c unicode python-extensions


【解决方案1】:

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

根据平台的不同,Py_UNICODE 可以定义为wchar_t(如果可用)或无符号短/整数/长,其宽度将根据 Python 的配置方式(UCS2 与 UCS4)和架构而有所不同和使用的 C 编译器。您可以在unicodeobject.h 中找到相关定义。

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

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

您可以在对象的初始化程序中执行类型检查:

...
if (!PyUnicode_CheckExact(arg)) {
    PyErr_Format(PyExc_ValueError, "arg must be a unicode string");
    return NULL;
}
Py_INCREF(arg);
self->wtext = arg;
...

如果您需要遍历 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]
    ...

【讨论】:

  • 我明白了。不过,如果我没记错的话,由于某些情况的处理方式,Python 参考似乎建议使用 T_OBJECT_EX 而不是 T_OBJECT
  • 是的,您可以改用T_OBJECT_EX。对于READONLY 属性(无法删除),T_OBJECT 也应该可以正常工作。选择还取决于您是希望 self-&gt;wtextNULL 值引发错误还是只返回 None,这实际上取决于您希望对象表现出的行为。
猜你喜欢
  • 1970-01-01
  • 2017-01-30
  • 2017-08-30
  • 1970-01-01
  • 2020-04-02
  • 2013-04-10
  • 2017-02-26
  • 2019-11-17
  • 2012-10-24
相关资源
最近更新 更多