2011-10-31 4 views
4

나는 간단한 파이썬 스크립트를 _tph.so로 컴파일파이썬 C API 유니 코드 인수

import _tph 
str = u'Привет, <b>мир!</b>' # Some unicode string with a russian characters 
_tph.strip_tags(str) 

와 C 라이브러리를 가지고있다.

PyObject *strip_tags(PyObject *self, PyObject *args) { 
    PyUnicodeObject *string; 
    Py_ssize_t length; 

    PyArg_ParseTuple(args, "u#", &string, &length); 
    printf("%d, %d\n", string->length, length); 

    // ... 
} 

printf 인쇄 기능이 : 1080 19 이것으로부터 strip_tags 함수이다. 그래서, str 길이는 실제로 19 기호이지만, 지옥의 깊은 곳에서 나는 그 1080자를 얻고 있습니까?

string을 인쇄 할 때 str, null char 및 많은 정크 바이트가 있습니다.

정크 메모리는 다음과 같습니다

U '\ u041f \ u0440 \ u0438 \ u0432 \ u0435 \ u0442, <B> \ u043c의 \ u0438의 \의 u0440! </B > \ x00에서 \ x00에서 \ u0299 \ Ub7024000 \ U08c55800 \ Ub7025904 \ x00에서 \ Ub777351c \ U08c79e58 \ x00에서 \ U08c7a0b4 \ x00에서 \ Ub7025904 \ Ub7025954 \ Ub702594c \ Ub702591c \ Ub702592c \ Ub7025934 \ x00에서 \ x00에서 \ x00에서

여기 정상적인 문자열을 어떻게 얻을 수 있습니까?

답변

5

여기서 "문자열"인수의 이름이 잘못 지정되었습니다. 이것은 파이썬 유니 코드 객체에 대한 포인터이기 때문에 printf가 0 바이트를 발견 할 때까지 printf가 많은 바이너리 데이터 (객체 유형, GC 헤더, ​​참조 카운트 및 인코딩 된 유니 코드 코드 포인트)를 보게됩니다. 문자열의 끝으로

문자열을 보는 가장 간단한 방법은 PyObject_Print(string)입니다. 파이썬 유니 코드 객체를 조작하기위한 C 함수는 다음에서 찾을 수 있습니다. http://docs.python.org/c-api/unicode.html#unicode-objects

+0

사실,이 코드 종류로 세그먼트 오류가 발생합니다 : PyObject_Print ((PyObject *) string, stdout, 0); 그리고 GIL 용 스레드 상태를 저장하려고했습니다. – SvartalF

+0

"string"은 PyUnicode 객체로 선언됩니다. 해당 객체를 가져 오려면 구문 분석 코드를 "O"로 변경하고 결과에 PyObject_Print()를 사용하십시오. 또는 선언을 유니 코드 버퍼 포인터로 변경하고 "u #"을 계속 사용하십시오. 후자는 계산 된 배열에 대한 포인터를 제공합니다 (printf와 함께 사용하기 위해 null로 끝나지 않았습니다). –

관련 문제