Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于桥接Python的Unicode友好体系结构';将字符串和字节类型转换为C++; 我正在编写一个C++ Python包装器。_Python_C++_C++11_Unicode_Python C Api - Fatal编程技术网

用于桥接Python的Unicode友好体系结构';将字符串和字节类型转换为C++; 我正在编写一个C++ Python包装器。

用于桥接Python的Unicode友好体系结构';将字符串和字节类型转换为C++; 我正在编写一个C++ Python包装器。,python,c++,c++11,unicode,python-c-api,Python,C++,C++11,Unicode,Python C Api,我计划创建一个通用对象类 class Object { private: PyObject* p; public: Object(int i) { /* construct PyLong */ } Object(double i) { /* construct PyFloat */ } : etc i、 使用者可以执行对象{42}或对象{3.14},Python运行时将构造一个匹配类型的PyObject。对象将指针存储在p中 现在我正在尝试处理字符

我计划创建一个通用对象类

class Object {
private:
    PyObject* p;
public:
    Object(int i)    { /* construct PyLong */ }
    Object(double i) { /* construct PyFloat */ }
    :
    etc
i、 使用者可以执行对象{42}或对象{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_解码吗

<>我不熟悉C++和Python中的Unicode处理,所以我提前请求指导。
<>编辑:阅读C++处理Unicode时,不同的操作系统可能会支持String vs WString()。因此,有必要指出,我正在尝试一种多平台(Windows、Linux、OS X、Android、iOS)解决方案。

Python2中的PyString/PyUnicode相当于Python3中的PyBytes/PyUnicode。在Python3中,有一个兼容头将PyString映射到PyBytes


因此,根据您的目标Python版本,请使用PyString/PyUnicode或PyBytes/PyUnicode,但不要混合使用PyString和PyBytes。将std::string/char*映射到PyBytes或PyString,并将std::wstring/wchar\u t*映射到PyUnicode。

我不熟悉Python,那么PyBytes和PyString之间的区别是什么?前一个是“ASCII”字符串,后一个是Unicode字符串?顺便说一下,C++中的STD::String始终不是Unicode;如果要处理Unicode符号,必须使用std::wstring。两个类都实例化了相同的模板类,即std::basic_string,前者用T==char,后者用T==wchar__T,这是一种更广泛的char类型。Python 2和3处理字符串和Unicode的方式完全不同,因此您需要指定使用的是哪种。此外,由于Python是开源的(以及它的大多数扩展),阅读它们来了解如何处理这类问题是非常有启发性的。