python - 用于将 Python 的 String 和 Bytes 类型桥接到 C++ 的 Unicode 友好架构

标签 python c++ c++11 unicode python-c-api

我正在编写一个 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/

相关文章:

c++ - 在C++和kinect中获取特定的关节位置

c++11 - 使用代码块 13.12、MinGW 4.8.1 和 SFML 2.1 时缺少一些 C++11 功能

python - 将前导零添加到 Python 中的数字列表

python - 按 x 比例缩放 matplotlib.pyplot.Axes.scatter markersize

python - 神经网络 pytorch

c++ - 在不停止程序的情况下在 C++ 中获取用户输入

Python:typing.cast 与内置类型转换

c++ - 为什么我退出循环后我的 map 值被重置

c++ - 避免构造函数中 const 引用和右值引用的指数增长

c++ - 无法在函数模板中使用 lambda 函数