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

时间:2019-06-22 20:33:29

标签: c++ utf-8 python-3.6 unicode-string python-extensions

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

我在Python脚本中使用了ctypes.windll.user32.MessageBoxW,并确保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 :(得分:0)

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

相关问题