在用 C++ 编写的 Python 3 扩展中,如何将 wstring 对象传递给 Python 代码?

In Python 3 extension written in C++, how to pass a wstring object to Python code?

我正在尝试使用 C++ 14 构建一个 Python 扩展。当模块在 Python 中初始化时,我要求调用者给我一个回调函数,该函数将字符串作为输入。

当调用模块中的函数时,我想做的是从磁盘读取一个文本文件,其中可能包含非英文字符。所以我在 C++ 代码中将它作为 wstring 读入内存。

下一步是将此 wstring 传递给 Python 代码。我是否应该像下面这样定义用户回调函数:

typedef std::string (*UserCallbackFunc)(std::string);

并处理 wstringutf-8 string 的转换,如下所示:

string wstring2utf8string(wstring input)
{
    wstring_convert<codecvt_utf8<wchar_t>> converter;
    return converter.to_bytes(input);
}

或者我可以像

这样简单地定义回调
typedef std::wstring (*UserCallbackFunc)(std::wstring);

直接从磁盘读取的内容传入?

让我自己回答这个问题。

我的目标是将 non-English 个字符从 C++ Python 3 扩展传递给 Python 回调函数。显然,除了使用 UTF-16 之外,UTF-8 足以让我实现这个目标。在 C++ 中,string 对 UTF-8 足够好,wstring 对 UTF-16 和 UTF-32 足够好。因此,在我将所有 wstring 更改为 string 之后,UTF-8 中的 non-English 字符从两边都可以正常工作。