簡體   English   中英

Python到C ++字符編碼

[英]Python to C++ Character encoding

我有一個C ++程序,該程序使用Python C / API來調用Python腳本獲取數據庫信息,但是接收到的數據未正確編碼。 這是在法國,因此我的數據包含重音符號和其他非英語字符。

在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é

我只希望“打印”功能能夠正確顯示信息...

這不是看起來簡單,我錯了,utf-8中的急性e是c3 a9 使用python的解釋器從控制台使用編碼非常困難。 您必須完成幾件事。

首先,您的控制台默認代碼頁(編碼)。 您可以通過發出chcp命令進行檢查。 我的是437,但幾乎不依賴Windows安裝。

latin-1的代碼頁為28591,而utf-8的代碼頁為65001 奇怪的是,當控制台的代碼頁為65001時,使用python解釋器很復雜,似乎尚未聲明它是python編碼庫中utf-8的同義詞。

我的意思是,您必須正確地對待自己的想法。 如果您的控制台在代碼頁X中,則您對python解釋器的輸入將以X進行編碼,您將看到X能夠管理字節的輸出。

我建議您在python中使用unicode而不是硬編碼的字符串,並使用scape字節代替字符。 例如,您可以這樣聲明robin:

robin = u'test\xe9'

U + 00E9是é的代碼 之后,robin是unicode,可以將其encoded為您想要的任何樣式: robin.encode('utf-8') 這樣,您可以控制變量以針對每種可能的輸出方案以任何編碼對其進行編碼。

要恢復它:

  1. 找出控制台的編碼
  2. encoderobin根據該編碼可變
  3. 控制台應正確輸出

希望這會有所幫助!

您調用PyObject_Repr ,它與Python中的repr(robin)相同,並產生文字字符\\x82 將其從呼叫鏈中刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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