2011-08-26 3 views
1

문자열을 wchar_t 배열로 처리하는 라이브러리와 이야기하고 있습니다. 이 배열을 char 배열로 변환하여 파이썬 (SWIG 및 Python의 PyString_FromString 함수 사용)으로 넘길 수 있도록해야합니다. 분명히 모든 와이드 문자가 문자로 변환 될 수있는 것은 아닙니다. 내가한다고 wcstombs에 대한 설명서에 따르면 unconvertable 문자 문자열을 테스트하는변환 가능한 문자에 대한 wchar_t * 테스트

wcstombs(NULL, wideString, wcslen(wideString)) 

같은 것을 할 수 있기를 - 반환 -1 어떤이있는 경우로했다. 그러나, 내 테스트 케이스에서는 항상 -1을 반환합니다. 여기 내 테스트 기능입니다 :

void getString(wchar_t* target, int size) { 
    int i; 
    for(i = 0; i < size; ++i) { 
     target[i] = L'a' + i; 
    } 
    printf("Generated %d characters, nominal length %d, compare %d\n", size, 
      wcslen(target), wcstombs(NULL, target, size)); 
}  

이 같은이 생성되어 출력 : 내가 무슨 일을하고 있어요

Generated 32 characters, nominal length 39, compare -1 
Generated 16 characters, nominal length 20, compare -1 
Generated 4 characters, nominal length 6, compare -1 

어떤 생각?

관련 노트에 wchar_t *에서 Python 유니 코드 문자열로 직접 변환하는 방법을 알고 있다면 환영 할 것입니다. :) 감사!

+0

문자열에 터미네이터를 쓰는 것을 잊어 버렸습니다. for 루프를 크기 -1로 변경 한 다음 마지막 문자로 '\ 0'을 쓰면 wcstombs 자체가 작동합니다. 시간을 낭비해서 미안해! 비록 누군가가 char를 통해가는 것보다 더 직접적인 변환을 알고 있다면, 그것은 여전히 ​​굉장 할 것입니다. – Derakon

+0

문제는 아니지만 wcstombs의 count 매개 변수로 0을 전달해야합니다. 이것은 출력 버퍼의 크기 (바이트)를 의미하며 NULL입니다. –

답변

0

분명히 알 수 있듯이 입력 데이터를 0으로 종료해야합니다.

마지막 단락에 대해서는 wide에서 UTF8로 변환하고 PyUnicode_FromString으로 전화합니다.

파이썬 2.x를 사용하고 있다고 가정합니다. 아마도 파이썬 3.x에서는 모두 다릅니다.

관련 문제