我正在为现有的 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 中的一个额外步骤,应该在扩展模块中自动执行。不幸的是,我无法弄清楚如何