Как преобразовать строку C (массив символов) в строку Python, если в строке есть не-ASCII-символы?
Я встроил интерпретатор Python в C-программу. Предположим, что программа C считывает некоторые байты из файла в массив char и узнает (каким-то образом), что байты представляют текст с определенной кодировкой (например, ISO 8859-1, Windows-1252 или UTF-8). Как мне декодировать содержимое этого массива char в строку Python?
Строка Python обычно должна иметь тип -unicode
например,0x93
в Windows-1252 кодированный ввод становится.u'\u0201c'
Я пытался использоватьPyString_Decode
, но всегда происходит сбой, когда в строке есть не-ASCII символы. Вот пример, который терпит неудачу:
#include
#include
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
#include
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;
}