2014-12-04 1 views
0

파이썬의 ctypes 모듈을 사용하여 파이썬에서 C++로 문자열을 보내려면 c_char_p (a char *)로 파싱해야합니다. 내가 파이썬 순수한 문자열과 파이썬을 사용하여 찾을 필요가 발견했습니다 유니 코드 문자열. 유니 코드 문자열을 사용하면 변수가 제대로 보내지 않고 덮어 씁니다. 표준 출력에 다음 위의 파이썬 코드를 실행유니 코드 문자열을 구문 분석하는 데 ctypes를 어떻게 사용할 수 있습니까?

C++

void test_function(char * a, char * b, char * c) { 
    printf("Result: %s %s %s", a, b, c); 
} 

파이썬

... load c++ using ctypes ... 

lib.test_function.argtypes = [c_char_p, c_char_p, c_char_p]  
lib.test_function(u'x', u'y', u'z') 
lib.test_function('x', 'y', 'z') 

제공합니다 :

Result: z z z 
Result: x y z 

는이 이유는,이 특질이다 여기에 예입니다 ctypes 중? 유니 코드 문자열을 가져올 수 있다면이 벼랑을 피하는 우아한 방법은 뭔가요?

감사합니다. 대신 c_char의

+0

파이썬 2에서 작동해야한다. ctypes는'ctypes.set_conversion_mode (encoding, errors)'에 의해 설정된 인코딩을 사용하여 유니 코드 텍스트 문자열을 암시 적으로 바이트 문자열로 변환한다. 대부분의 시스템에서이 기본값은 엄격한 ASCII입니다. OTOH의 Python 3에서 ctypes는 바이트 문자열과 텍스트 문자열을 자동으로 변환하지 않습니다. – eryksun

+0

어떤 Python 버전과 플랫폼을 사용하고 있습니까? – eryksun

+0

파이썬 2.7에서 OSX 10.9를 사용하고 있습니다. 나는 ctypes 변환 모드를보고 그것이 무엇으로 설정되어 있는지 살펴볼 것입니다. 아마도 이것은 내 실수 일 것입니다. – rykardo

답변

0

C/C++ has no real support for Unicode, 그래서 정말 당신이 그것에 대해 할 수있는 일이 없다. 을 C/C++ 세계로 전달하기 위해 문자열을 인코딩해야합니다. 유스 케이스에 따라 UTF-8, UTF-16 또는 UTF-32를 사용할 수 있습니다.

(/ C++를 C 파이썬에서 byteschar *)를 예를 들어, UTF-8로 인코딩 할 수 있으며 바이트의 배열을 전달 :

lib.test_function(u'x'.encode('utf8'), 
        u'y'.encode('utf8'), 
        u'z'.encode('utf8')) 

정확히 당신이 선택 인코딩하는 것은 또 다른 이야기이다, 그러나 C++ 라이브러리가 받아 들일 수있는 것에 의존 할 것입니다.

+0

통찰력의 답을 선택하십시오. 거기에 통찰력을 가져 주셔서 감사합니다! – rykardo

관련 문제