Python 2.7/3 C模块,用于使用Unicode字符串



我在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,现在的问题更清楚。

最后,我发现我没有注意一个重要的事情:py_unicode包含我需要的所有文本数据,仅此而已。这种类型的字节大小可能会有所不同,因此在不同的操作系统中应检查。无论如何,我的Linux构建中的WCHAR_T和PY_UNICODE之间没有区别,因此我唯一面临的问题是设置该语言环境。简单的解决者:

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

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

最新更新