[英]python3 C extension module with cp1252 encoded string
我正在為現有的 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
可以為任何標准編碼完成這項工作,甚至不必先創建一個bytes
對象。 (您可以將它與代碼N
一起傳遞給Py_BuildValue
以避免擔心引用計數,盡管該技巧並不適用於所有情況。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.