如何将 PyObject 转换为 UTF-8 字符串?

How to convert PyObject to UTF-8 string?

我正在尝试将字符串值传递给 Python 函数并获取 utf-8 字符串值。该函数检索日文字符和另一种语言的 returns 个字符。

我在Python脚本中使用了ctypes.windll.user32.MessageBoxW,确保Python函数没有问题。我尝试了一个像return 'hello world'这样的简单函数来测试。我还用 assert 检查了每个函数。我想问题是从 PyBytes_AsString 开始的。它总是 returns 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();

result = PyBytes_AsString(str) returns 指向 str 内部缓冲区的指针,因此在将 result 写入文件之前不要 Py_DECREF(str)