2010-05-11 57 views
1

我们的C++的lib工作正常使用的python2.4痛饮,返回一个C++的char *回蟒蛇海峡。但是这个解决方案在Python3.0中遇到了问题,错误是:C++的字符*通过痛饮在Python有问题3.0

Exception =(UnicodeDecodeError('utf8',b“\ xb6 \ x9d \ xa .....”,0,1,'unexpected code byte “)

我们的定义是一样(工作精细在Python 2.4):

void cGetPubModulus(
void* pSslRsa, 
    char* cMod, 
    int* nLen); 

%include "cstring.i" 
%cstring_output_withsize(char* cMod, int* nLen); 

可疑痛饮自动做了Bytes->海峡转换在它的python2.4可以是隐式但在Python3.0它没有长允许..任何人有一个好主意吗?感谢

回答

3

这是相当的Python 3,做这种转换。在Python 2通过tes和str是相同的东西,在Python 3中str是unicode,所以某处某处试图用UTF8将它转换为Unicode,但它不是UTF8。

你的Python 3代码需要不会返回一个Python海峡,而是一个Python字节。但是,这不适用于Python 2,因此您需要预处理器语句来处理差异。

3

我遇到了类似的问题。我写了一大口类型映射自定义char阵列(实际上是一个unsigned char),它使用Python 3时,有段错误所以我调试的类型映射中的代码,我意识到这个问题伦纳特状态。

我对这个问题的解决方案是做这类型表如下:

%typemap(in) byte_t[MAX_FONTFACE_LEN] { 
    if (PyString_Check($input)) 
    { 
    $1 = (byte_t *)PyString_AsString($input); 
    } 
    else if (PyUnicode_Check($input)) 
    { 
    $1 = (byte_t *)PyUnicode_AsEncodedString($input, "utf-8", "Error ~"); 
    $1 = (byte_t *)PyBytes_AS_STRING($1); 
    } 
    else 
    { 
    PyErr_SetString(PyExc_TypeError,"Expected a string."); 
    return NULL; 
    } 
} 

也就是说,我检查什么样的字符串对象PyObject的是。如果函数PyString_AsString()PyUnicode_AsString()的输入分别是UTF-8字符串或Unicode字符串,则它将返回> 0。如果它是一个Unicode字符串,我们在调用PyUnicode_AsEncodedString()时将该字符串转换为字节,稍后我们将这些字节转换为char *,并调用PyBytes_AS_STRING()

注意,我隐约使用相同的变量,用于存储Unicode字符串和后来将其转换成字节。尽管这是可疑的,也许,它可能在另一个编码式的讨论中得出,事实是我解决了我的问题。我已经用python3python2.7二进制文件测试了它,但没有任何问题。

最后,最后一行是在Python调用复制的例外,通知关于输入不是字符串,使用UTF也不统一。