3

Python C/API を使用して Python スクリプトを呼び出して DB 情報を取得する 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")));

次の内容で満たされた char* を取得します: test\x82

そして、そこから文字列またはwstringを作成すると、同じ結果が得られます。

"testé"という文字列を作成できるようにしたいと思います。次のように、Python ターミナルで変数を正しく出力できることから始まると思います。

    >>> robin = 'testé'
    >>> robin
    'testé'

encode()、decode()、sys.setdefaultencoding、sys.stdout.encoding、さらには Django の 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é

「印刷」が情報を正しく表示するために何をしたいだけです...

4

2 に答える 2

1

これは見た目ほど単純ではありません。私は間違っていました。utf-8 の深刻な e はc3 a9. Python のインタープリターを使用してコンソールからエンコーディングを操作するのは困難です。あなたが正しくしなければならないことがいくつかあります。

まず、コンソールのデフォルト コード ページ (エンコーディング)。これは、コマンドを発行して確認できますchcp。私は437と言いますが、Windowsのインストールにはほとんど依存しません。

latin-1 のコード ページは 28591 で、utf-8 のコード ページは 65001です。奇妙なことに、コンソールにコードページ 65001 がある場合、Python インタープリターを使用するのは複雑です。Pythonutf-8のエンコーディング ライブラリで同義語であると宣言されていないようです。

ここでの私のポイントは、あなたの心を正しくしなければならないということです。コンソールがコード ページ X の場合、Python のインタープリターへの入力は X でエンコードされ、X がバイトを管理できる方法で出力が表示されます。

Python でハード エンコードされた文字列の代わりに Unicode を使用し、文字の代わりにスケープ バイトを使用することをお勧めします。たとえば、次のように robin を宣言できます。

robin = u'test\xe9'

U+00E9 は é のコードです。その後、robin は unicode であり、次のようencodedに任意の econding に入ることができますrobin.encode('utf-8')。このようにして、変数を制御して、考えられるすべての出力シナリオの任意のエンコードでエンコードできます。

再開するには:

  1. コンソールのエンコーディングを把握する
  2. encoderobinこのエンコーディングによる変数
  3. コンソールはそれを正しく出力するはずです

これが役に立てば幸いです!

于 2013-06-13T13:17:30.020 に答える