gpt4 book ai didi

带有cp1252编码字符串的python3 C扩展模块

转载 作者:太空宇宙 更新时间:2023-11-04 04:06:19 25 4
gpt4 key购买 nike

我正在为现有的 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 字节对象,那么我可以将该字节对象转换回我的字符串带有 .decode('cp1252') 的 python 代码。但是,这是 Python 中的一个额外步骤,应该在扩展模块中自动执行。不幸的是,我无法弄清楚如何

最佳答案

PyUnicode_Decode可以为任何standard encoding做这个工作甚至不必先创建一个 bytes 对象。 (您可以将它与代码 N 一起传递给 Py_BuildValue 以避免担心引用计数,尽管该技巧并不适用于所有情况。)

关于带有cp1252编码字符串的python3 C扩展模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57316524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com