我已在C程序中嵌入了Python解释器。假设C程序将某些字节从文件读入到char数组中,并(以某种方式)知道这些字节代表某种编码的文本(例如ISO 8859-1、Windows-1252或UTF-8)。那么我应该如何将此char数组的内容解码为Python字符串?
Python字符串通常应为
我尝试使用
错误信息为
以下代码通过使用
Python字符串通常应为
unicode
类型——例如,Windows-1252编码输入中的0x93
将变成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'编解码器无法对位置0处的字符u'\u201c'进行编码:超出范围(128)
,这表明在调用PyString_Decode
时使用了ascii
编码,尽管我们指定了windows_1252
。以下代码通过使用
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;
}