我在 C 程序中嵌入了一个 Python 解释器。假设 C 程序从一个文件中读取一些字节到一个 char 数组中,并且(不知何故)得知这些字节表示具有某种编码(例如,ISO 8859-1、Windows-1252 或 UTF-8)的文本。如何将此 char 数组的内容解码为 Python 字符串?
Python 字符串通常应该是类型unicode
——例如,0x93
Windows-1252 编码输入中的 a 变成u'\u0201c'
.
我尝试使用PyString_Decode
,但是当字符串中有非 ASCII 字符时它总是失败。这是一个失败的例子:
#include <Python.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
char c_string[] = { (char)0x93, 0 };
PyObject *py_string;
Py_Initialize();
py_string = PyString_Decode(c_string, 1, "windows_1252", "replace");
if (!py_string) {
PyErr_Print();
return 1;
}
return 0;
}
错误消息是UnicodeEncodeError: 'ascii' codec can't encode character u'\u201c' in position 0: ordinal not in range(128)
,这表明ascii
即使我们windows_1252
在对 的调用中指定了编码也被使用PyString_Decode
。
以下代码通过使用PyString_FromString
创建未解码字节的 Python 字符串,然后调用其decode
方法来解决此问题:
#include <Python.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
char c_string[] = { (char)0x93, 0 };
PyObject *raw, *decoded;
Py_Initialize();
raw = PyString_FromString(c_string);
printf("Undecoded: ");
PyObject_Print(raw, stdout, 0);
printf("\n");
decoded = PyObject_CallMethod(raw, "decode", "s", "windows_1252");
Py_DECREF(raw);
printf("Decoded: ");
PyObject_Print(decoded, stdout, 0);
printf("\n");
return 0;
}