簡體   English   中英

帶有 cp1252 編碼字符串的 python3 C 擴展模塊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM