我有一個使用Python C / API來為數據庫信息調用Python腳本的C ++程序,但是接收到的數據沒有以正確的方式編碼。這是在法國,因此我的數據包含重音符號和其他非英語字符。在sys.defaultencoding設置為“ utf-8”的python終端中,示例: >>> robin = 'testé' >>> robin 'test\x82' >>> print robin testé >>> str(robin) 'test\x82'如果我打電話給: PyString_AsString(PyObject_Repr(PyObject_GetAttrString(/*PyObject of my Py_Init*/, "robin")));我得到一個充滿以下內容的字符*:test \ x82從中創建一個字符串或wstring會得到相同的結果。我希望能夠創建一個表示“testé”的字符串,并且我猜想首先要能夠在python終端中正確輸出變量,如下所示: >>> robin = 'testé' >>> robin 'testé'我嘗試了Django的encode()encode(),sys.setdefaultencoding,sys.stdout.encoding,甚至是一些force_text和force_bytes。似乎沒有什么可以讓我得到包含我實際字符的標準C ++字符串的。任何幫助將不勝感激。僅供參考-Python 2.7,Windows 8 x64,VS2012和C ++ 9編輯以回答評論: >>> import sys >>> reload(sys) <module 'sys' (built-in)> >>> sys.setdefaultencoding('utf-8') >>> sys.getdefaultencoding() 'utf-8' >>> robin = 'testé' >>> robin 'test\x82' >>> print robin testé我只希望“打印”能夠正確顯示信息...
3 回答

SMILET
TA貢獻1796條經驗 獲得超4個贊
這并不像看起來那樣簡單,我錯了,utf-8中的急性e是c3 a9
。使用python的解釋器從控制臺使用編碼非常困難。您必須正確對待幾件事。
首先,您的控制臺默認代碼頁(編碼)。您可以通過發出chcp
命令來檢查。我的是437,但幾乎不依賴于Windows安裝。
latin-1的代碼頁為28591,而utf-8的代碼頁為65001。奇怪的是,當控制臺的代碼頁為65001時,使用python解釋器很復雜,似乎尚未聲明它是utf-8
python編碼庫中的同義詞。
我的意思是,您必須正確地對待自己的想法。如果您的控制臺在代碼頁X中,則您對python解釋器的輸入將以X編碼,您將看到X能夠管理字節的輸出。
我建議您在python中使用unicode而不是硬編碼的字符串,并使用scape字節代替字符。例如,您可以這樣聲明robin:
robin = u'test\xe9'
U + 00E9是é的代碼。之后,robin是unicode,可以encoded
像這樣進入任何您想要的環境:robin.encode('utf-8')
。這樣,您可以控制變量以針對每種可能的輸出方案以任何編碼對其進行編碼。
要恢復它:
找出控制臺的編碼
encode
robin
根據此編碼的變量控制臺應正確輸出
希望這會有所幫助!
添加回答
舉報
0/150
提交
取消