在Boost Python中使用一个接受std::wstring参数的c++函数来使用Unicode
Using Unicode in Boost Python with a C++ function that takes std::wstring
我正在使用Boost Python库来包装我拥有的c++类,以便我可以从Python调用其方法。我的c++类Clazz
有公共方法:
void doSomething(std::string& s) { ... }
void doSomethingWide(std::wstring& ws) { ... }
我已经创建了一个指向这两个方法的BOOST_PYTHON_MODULE
。第一个使用std::string
的我可以称之为fine。但是,当我尝试使用Python Unicode字符串调用第二个时:
x = u'hello'
Clazz.doSomethingWide(x)
我得到错误:
ArgumentError: Python argument types in
Clazz.doSomethingWide(Clazz, unicode)
did not match C++ signature:
doSomething(Clazz, std::wstring)
我曾希望unicode
能自动与std::wstring
连接,就像普通的Python字符串类型与std::string
连接一样。然而,情况似乎并非如此。
在另一个线程中,有人建议先做转换:
x = str(x.encode('utf-8'))
然而,我正在处理非常大的字符串,这破坏了我的代码的性能,因为它是 0 (n)在x
的字符数。
我确实有能力修改我试图与之接口的c++库。是否有一种方法可以将Python unicode
类型传递到我的c++库中,以便我可以使用它们?我已经搜索了互联网远和广泛,并找到了一些参考转换器和其他东西,但实现它们并没有修复上述错误消息(很可能我没有正确使用它们)。
简而言之,类型转换通常导致右值对象,因此形参必须要么接受值,要么接受const引用。因此,改变:
void doSomethingWide(std::wstring&);
转换为下列任意一种:
void doSomethingWide(std::wstring);
void doSomethingWide(const std::wstring&);
提振。Python在11-SEP-2003上添加了std::wstring
转换。作为一般规则,在Boost中发生类型转换时。在Python中,结果对象被视为右值。此行为在boost::python::extract
观察者规范中间接指出:
将存储的指针转换为
result_type
,即T
或T const&
。
如果支持左值转换,它可能会为某些类型引入尴尬的语义。例如,不可变的Python字符串可以被c++函数修改。
下面是一个完整的最小示例:
#include <iostream>
#include <string>
#include <boost/python.hpp>
class spam
{
public:
void doSomething(const std::string& str)
{
std::cout << "spam::doSomething(): " << str << std::endl;
}
void doSomethingWide(const std::wstring& str)
{
std::wcout << "spam::doSomethingWide(): " << str << std::endl;
}
};
BOOST_PYTHON_MODULE(example)
{
namespace python = boost::python;
python::class_<spam>("Spam")
.def("doSomething", &spam::doSomething)
.def("doSomethingWide", &spam::doSomethingWide)
;
}
互动用法:>>> import example
>>> spam = example.Spam()
>>> spam.doSomething("test")
spam::doSomething(): test
>>> spam.doSomethingWide(u"test")
spam::doSomethingWide(): test
- Ctypes wstring通过引用传递
- C++ - Unicode Newline
- 如何将unicode字符串从C++传递到delphi
- 在C++中将变量 wstring 分配给 Char 数组
- ascii 和 unicode 在处理级别有什么区别吗?
- 无法从 std::string 中提取C++ Unicode 符号
- MinGW64 - Unicode 源文件错误?
- 使用 Visual Studio 2019 编译 Unicode
- 将日语 wstring 转换为 std::string
- 将ANSI C字符串转换为UNICODE
- 如何从 oracle 数据库 c++ 读取 unicode
- 在特定 Unicode 路径中创建文件
- 使用 memcpy 将矢量数据复制到 wstring 的正确方法
- 将wstring转换为Unicode
- 在Boost Python中使用一个接受std::wstring参数的c++函数来使用Unicode
- 读取Unicode UTF-32文件到wstring
- c++使用wstring拆分unicode分隔字符串
- 如何将C++dll中的unicode字符串/wstring/CStringW返回到InstallScript
- 将Unicode字符转换为wstring
- 根据MSVC++中的unicode设置,在std::string和std::wstring之间自动切换