Как конвертировать PyObject в строку UTF-8? - PullRequest
0 голосов
/ 22 июня 2019

Я пытаюсь передать строковое значение в функцию Python и получить строковое значение utf-8. Функция извлекает японские символы и возвращает символы на другом языке.

Я использовал ctypes.windll.user32.MessageBoxW в скрипте Python и убедился, что с функцией Python проблем нет. И я попробовал простую функцию, такую ​​как return 'hello world', чтобы проверить. Я также проверил каждую функцию с помощью assert. Я думаю, что проблема начинается с PyBytes_AsString. Всегда возвращает DB DB DB DB DB DB DB... (в шестнадцатеричном формате). Но я не знаю, как это исправить.

char* result;
PyObject* module, *func, *arg, *ret, *value;

Py_Initialize();

PyObject* sysPath = PySys_GetObject("path");
PyObject* path = PyUnicode_FromString(".");
PyList_Append(sysPath, path);

module = PyImport_ImportModule("test");

if (module != 0)
{
    const wchar_t* w = L"翻訳テスト";
    func = PyObject_GetAttrString(module, "translate");
    arg = PyTuple_New(1);
    value = PyUnicode_FromWideChar(w, wcslen(w));
    PyTuple_SetItem(arg, 0, value);
    ret = PyObject_CallObject(func, arg);

    PyObject* repr = PyObject_Repr(ret);
    PyObject* str = PyUnicode_AsEncodedString(repr, "utf-8", "strict");
    result = PyBytes_AsString(str);

    Py_DECREF(repr);
    Py_DECREF(str);
    Py_DECREF(module);
    Py_DECREF(func);
    Py_DECREF(arg);
    Py_DECREF(ret);

    fstream file("text.txt", std::ios::out);
    file << result;
    file.close();
}

Py_Finalize();

1 Ответ

0 голосов
/ 23 июня 2019

result = PyBytes_AsString(str) возвращает указатель на внутренний буфер str, поэтому не Py_DECREF(str), прежде чем записать result в файл.

...