我正在编写一个 C++ Python 包装器。
我打算有一个通用的 Object 类,
class Object {
private:
PyObject* p;
public:
Object(int i) { /* construct PyLong */ }
Object(double i) { /* construct PyFloat */ }
:
etc
即消费者可以执行 Object{42} 或 Object{3.14},Python 运行时将构造匹配类型的 PyObject。对象然后将指针存储在 p 中。
现在我正在尝试处理字符串类型。我注意到 Python 有一个 PyBytes 和一个 PyString 基元,我正在考虑:
Object(const char* cstr) { /* construct PyBytes */ }
Object(const std::string& s) { /* construct PyString */ }
但我认为这个问题可能与 Unicode 结合在一起。
例如,我可以提供一个额外的构造函数,允许构造 Unicode PyString:
Object( const std::string& s, const char* enc, const char* err=nullptr )
: Object{ PyUnicode_Decode( s.c_str(), s.size(), enc, err ) }
{ }
但是我能做些更聪明的事情吗?我可以检查 std::string 的编码并直接调用 PyUnicode_Decode 吗?
我不熟悉 C++ 和 Python 中的 Unicode 处理,所以我提前寻求指导。
编辑:阅读 C++ 对 Unicode 的处理,似乎不同的操作系统可能更喜欢 string 与 wstring ( std::wstring VS std::string )。因此,可能有必要指出我正在尝试一种多平台(Windows、Linux、OS X、Android、iOS)解决方案。
最佳答案
Python 2 中的 PyString/PyUnicode 等同于 Python 3 中的 PyBytes/PyUnicode。在 Python 3 中,有一个将 PyString 映射到 PyBytes 的兼容性 header 。
因此,根据您的目标 Python 版本,使用 PyString/PyUnicode 或 PyBytes/PyUnicode,但不要混用 PyString 和 PyBytes。将 std::string/char* 映射到 PyBytes 或 PyString,并将 std::wstring/wchar_t* 映射到 PyUnicode。
关于python - 用于将 Python 的 String 和 Bytes 类型桥接到 C++ 的 Unicode 友好架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27459480/