2010-05-11 40 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也不統一。