Как преобразовать строку 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;
}

Ответы на вопрос(3)

Ваш ответ на вопрос