PyUnicode字符串和C字符串之间的字符串转换如何工作?

Com*_*cus 5 c python python-c-api python-3.x python-internals

我有一个PyUnicode对象,我正在尝试将其转换回C字符串(char *)。

我尝试执行的方式似乎无效。这是我的代码:

PyObject * objectCompName = PyTuple_GET_ITEM(compTuple, (Py_ssize_t) 0);
PyObject * ooCompName = PyUnicode_AsASCIIString(objectCompName);
char * compName = PyBytes_AsString(ooCompName);
Py_DECREF(ooCompName);
Run Code Online (Sandbox Code Playgroud)

我还有另一种/更好的方法吗?

Ant*_*ala 8

如果采用UTF-8编码char *是可以的,则绝对应该使用PyUnicode_AsUTF8AndSize(需要Python 3.3):

PyObject * objectCompName = PySequence_GetItem(compTuple, 0);
if (! objectCompName) {
    return NULL;
}

Py_ssize_t size;
char *ptr = PyUnicode_AsUTF8AndSize(objectCompName, &size);
if (!ptr) {
    return NULL;
}

// notice that the string pointed to by ptr is not guaranteed to stay forever,
// and you need to copy it, perhaps by `strdup`.
Run Code Online (Sandbox Code Playgroud)

另外,请务必理解检查您在代码中执行的每个函数调用的返回值是强制性的Py*

如果不是或原因,PyTuple_GetItem将在这里返回。如果不是对象,则将返回。忽略返回值,当条件合适时CPython崩溃。NULLcompTupletuple0IndexErrorPyUnicode_AsUTF8AndSizeNULLobjectCompNamestrSIGSEGV