在用 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);
并处理 wstring
到 utf-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 字符从两边都可以正常工作。
我正在尝试使用 C++ 14 构建一个 Python 扩展。当模块在 Python 中初始化时,我要求调用者给我一个回调函数,该函数将字符串作为输入。
当调用模块中的函数时,我想做的是从磁盘读取一个文本文件,其中可能包含非英文字符。所以我在 C++ 代码中将它作为 wstring
读入内存。
下一步是将此 wstring
传递给 Python 代码。我是否应该像下面这样定义用户回调函数:
typedef std::string (*UserCallbackFunc)(std::string);
并处理 wstring
到 utf-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 字符从两边都可以正常工作。