나는 간단한 파이썬 스크립트를 _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에서
여기 정상적인 문자열을 어떻게 얻을 수 있습니까?
사실,이 코드 종류로 세그먼트 오류가 발생합니다 : PyObject_Print ((PyObject *) string, stdout, 0); 그리고 GIL 용 스레드 상태를 저장하려고했습니다. – SvartalF
"string"은 PyUnicode 객체로 선언됩니다. 해당 객체를 가져 오려면 구문 분석 코드를 "O"로 변경하고 결과에 PyObject_Print()를 사용하십시오. 또는 선언을 유니 코드 버퍼 포인터로 변경하고 "u #"을 계속 사용하십시오. 후자는 계산 된 배열에 대한 포인터를 제공합니다 (printf와 함께 사용하기 위해 null로 끝나지 않았습니다). –