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