PyString_Depre这样做:
PyObject *PyString_Depre(const char *s, Py_ssize_t size, const char *encoding, const char *errors){ PyObject *v, *str; str = PyString_FromStringAndSize(s, size); if (str == NULL) return NULL; v = PyString_AsDepredString(str, encoding, errors); Py_DECREF(str); return v;}IOW,它基本上完成了第二个示例中的操作-
转换为字符串,然后对该字符串进行解码。这里的问题来自于PyString_AsDepredString,而不是PyString_AsDepredObject。PyString_AsDepredString会执行PyString_AsDepredObject,但随后尝试将生成的unipre对象转换为具有默认编码的字符串对象(对您来说,看起来像是ASCII)。那就是失败的地方。
我相信您需要进行两次调用-但您可以使用PyString_AsDepredObject而不是调用python的“ depre”方法。就像是:
#include <Python.h>#include <stdio.h>int main(int argc, char *argv[]){ char c_string[] = { (char)0x93, 0 }; PyObject *py_string, *py_unipre; Py_Initialize(); py_string = PyString_FromStringAndSize(c_string, 1); if (!py_string) { PyErr_Print(); return 1; } py_unipre = PyString_AsDepredObject(py_string, "windows_1252", "replace"); Py_DECREF(py_string); return 0;}我不完全确定PyString_Depre以这种方式工作的原因是什么。python-
dev上的一个很老的线程似乎表明它与链接输出有关,但是由于Python方法没有做同样的事情,所以我不确定这是否仍然有用。



