3

我有一个 C++ 程序,它使用 Python C/API 调用 Python 脚本以获取 DB 信息,但接收到的数据没有以正确的方式编码。这是在法国,所以我的数据有口音和其他非英语字符。

在 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 解释器很复杂,似乎还没有声明它是utf-8python 编码库中的同义词。

我的观点是,你必须让你的想法正确。如果您的控制台在代码页 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. 控制台应该正确输出

希望这有帮助!

于 2013-06-13T13:17:30.020 回答
0

您调用PyObject_Reprwhich 与 Python 中的相同repr(robin),并生成文字字符\x82。将其从您的呼叫链中排除。

于 2013-06-13T13:03:13.003 回答