我有一个 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")));
我得到一个 char* 填充以下内容:test\x82
并从中创建一个 string 或 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é
我只希望“打印”能正确显示信息...
最佳答案
这并不像看起来那么简单,我错了,utf-8中的尖锐e是c3 a9
.使用 Python 的解释器从控制台处理编码是很困难的。有几件事你必须做对。
首先,您的控制台默认代码页(编码)。您可以通过发出 chcp
命令来检查这一点。我说的是 437,但这几乎取决于您的 Windows 安装。
Code page for latin-1 is 28591 and code page for utf-8 is 65001 .奇怪的是,当控制台有代码页 65001 时使用 python 解释器很复杂,似乎没有声明它是 python 编码库中 utf-8
的同义词。
我的意思是,您必须正确思考。如果您的控制台在代码页 X 中,您对 Python 解释器的输入将在 X 中进行编码,您将看到 X 能够管理字节的方式的输出。
我建议您在 python 中使用 unicode 而不是硬编码字符串,并使用 scape 字节而不是字符。例如,您可以这样声明知更鸟:
robin = u'test\xe9'
U+00E9 is the code for é .之后,robin 是 unicode 并且可以像这样被编码
成任何你想要的编码:robin.encode('utf-8')
。通过这种方式,您可以控制变量以针对每种可能的输出场景以任何编码对其进行编码。
恢复它:
- 弄清楚你的控制台的编码
encode
robin
变量根据这个编码- 控制台应该正确输出
希望对您有所帮助!
关于c++ - Python 到 C++ 字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17087177/