2010-05-11 1 views
1

C++ lib는 Swig를 사용하여 Python2.4에서 잘 작동하여 C++ char *을 파이썬 str에 반환합니다. 그러나이 솔루션은 Python3.0에서 문제를 일으켰습니다. 오류 :swig의 C++의 char *가 파이썬 3.0에서 문제가 발생했습니다

Exception = (UnicodeDecodeError ('utf8', b "\ xb6 \ x9d \ xa .....", 0, 1, '예기치 않은 코드 바이트 ')

우리의 정의() 파이썬 2.4에서 잘 작동 같다 :.

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

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

용의자 꿀꺽 꿀꺽 자동으로 Bytes-> str을 변환하고있다 python2.4에서는이 될 수 있습니다 암시 만에 Python3.0 그것은 오래 허용되지 않습니다 .. 누구나 좋은 생각있어? 감사합니다

답변

3

그 변환을하는 것은 오히려 파이썬 3입니다. 파이썬 2에서 tes와 str은 똑같습니다. 파이썬 3에서는 str이 유니 코드이므로, 어딘가에서 그것을 UTF8로 유니 코드로 변환하려하지만 UTF8이 아닙니다.

파이썬 3 코드는 파이썬 문자열이 아니라 파이썬 바이트를 반환해야합니다. 하지만 파이썬 2에서는 작동하지 않으므로, 차이점을 처리하기 위해 프리 프로세서 명령문이 필요하다.

3

비슷한 문제가 발생했습니다. 나는 사용자 정의 char 배열 (사실 unsigned char)을위한 SWIG typemap을 썼고, 파이썬 3을 사용할 때 SEGFAULT를 얻었다. 그래서 나는 typemap 내에서 코드를 디버깅했고 나는 Lennart가 말한 문제를 깨달았다. 그 문제에

내 솔루션은 그 타입 맵에서 다음을 수행 하였다

입니다
%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 문자열 또는 유니 코드 문자열 인 경우 > 0을 반환합니다. 유니 코드 문자열 인 경우 해당 문자열을 PyUnicode_AsEncodedString()에서 바이트로 변환 한 다음 나중에 PyBytes_AS_STRING()을 사용하여 해당 바이트를 char *으로 변환합니다.

유니 코드 문자열을 저장하고 나중에 바이트로 변환하는 데 나는 동일한 변수를 막연하게 사용합니다. 의심스럽지 만 어쩌면 다른 코딩 스타일의 토론에서 파생 될 수도 있지만 실제로는 내 문제를 해결했습니다. 나는 아직 아무런 문제없이 python3python2.7 바이너리로 테스트 해 보았습니다.

그리고 마지막으로 파이썬 호출에서 예외를 복제하여 그 입력이 utf 나 unicode 중 하나의 문자열이 아님을 알리기위한 것입니다.