-1

我在 Python 模块中遇到了关于 UTF-8/16 的不同方法。这是我第一次尝试编写 Python C 模块,我想知道如何从 Unicode 对象中获取所有字节以使用 C 函数处理这些字节。如我所见,这些可以表示为 C char 数组中的简单 ASCII 字符串?

static PyObject* unicode_worker(PyObject* self, PyObject* args)
{
Py_UNICODE  *src;
int srclen;
register Py_UNICODE ch;
wchar_t widecharBuffer[4096];

if (! PyArg_ParseTuple(args, "u#", &src, &srclen))
    return NULL;

ch = *src;

PyUnicode_AsWideChar((PyUnicodeObject *)src, widecharBuffer, srclen-1);

Py_RETURN_NONE;
}

现在当我使用 gdb 时:

gdb python
run sh.py

我可以看到错误:

Program received signal SIGSEGV, Segmentation fault.
0x00000036010b05c8 in PyUnicodeUCS4_AsWideChar () from /usr/lib64/libpython2.7.so.1.0

PyUnicode_AsWideChar 调用中可以改进什么,现在有什么问题?

UPD:Mats Petersson,现在问题更清楚了。

4

1 回答 1

1

最后,我发现我没有注意一件重要的事情:Py_UNICODE 包含我需要的所有文本数据,仅此而已。这种类型的字节大小可能会有所不同,因此在不同的操作系统中应该进行检查。无论如何,在我的 Linux 版本中 wchar_t 和 Py_UNICODE 之间没有区别,所以我面临的唯一下一个问题是设置语言环境。它只是求解器:

if (! setlocale(LC_ALL, "ru_RU.utf8")) return PyErr_SetFromErrno(SetLocaleError);
wprintf(L"%ls\n", src);

现在我可以继续尝试python模块,这个问题似乎解决了。

于 2012-12-25T01:09:23.397 回答