2

我正在为现有的 C++ 库编写 Python3 扩展模块,它返回一个似乎采用 cp1252 编码的字符串。C++ 函数签名是

int get_name(std::string& name);

其中name是包含 c_str() 内容的输出变量,例如 0xb04600,它是 cp1252 代码页中的 DegreeSymbol,后跟大写字母F,由 NULL 字符完成。

在我的 python 扩展 C++ 代码中,我写了

std::string name;
int retval = get_value(name);
py_retval = Py_BuildValue((char *) "is#", retval, (name).c_str(), (name).size());

但是,这会导致以下运行时异常

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 0: invalid start byte

我将 cp2152 编码的字符串返回到 python 的正确方法是什么?

更新 我发现如果我使用y#而不是s#从扩展中返回一个 Python 字节对象,那么我可以将该字节对象转换回我的 python 代码中的字符串.decode('cp1252')。但是,这是 Python 中的一个额外步骤,应该在扩展模块中自动执行。不幸的是,我无法弄清楚如何

4

1 回答 1

1

PyUnicode_Decode可以为任何标准编码完成这项工作,甚至不必先制作一个bytes对象。(您可以将其与代码N一起传递Py_BuildValue以避免担心引用计数,尽管该技巧并不适用于所有情况。)

于 2019-08-02T00:14:20.393 回答