2011-11-25 3 views
0

size_t mbstowcs (wchar_t * dest, const char * src, size_t n);mbstowcs를 올바르게 호출하는 방법은 무엇입니까?

나는 안드로이드 플랫폼에서 유니 코드로 변경해야하는 gb2312를 사용하여 인코딩 된 정보가 있습니다.

1.이 메서드를 호출하기 전에 setlocale (LC_ALL, "zh_CN.UTF-8")을 사용하는 것이 맞습니까?

2. 대상을 할당해야하는 이유는 무엇입니까?

3. 무엇을 n에 전달할 것인가? strlen (src)입니까?

대단히 감사합니다.

답변

1

mbstowcs()은 현재 로켈의 멀티 바이트 인코딩에서 넓은 문자열로 문자열을 변환합니다. 넓은 문자열은 반드시 유니 코드는 아니지만 Linux에서는 (UCS32)입니다.

로케일을 zh_CN.UTF-8으로 설정하면 현재 로켈의 멀티 바이트 인코딩은 GB2312가 아닌 UTF-8이됩니다. 멀티 바이트 인코딩을 사용하여 입력을 처리하려면 GB2312 로켈을 설정해야합니다.

size_t n = strlen(src) + 1; 
wchar_t *dest = malloc(n * sizeof dest[0]); 

이 (glibc는이 확장자가 :

C 표준은 필요한 와이드 문자의 수에 상한으로 strlen(src)을 사용할 수 있도록 하나의 멀티 바이트 문자가 최대 한 다양한 캐릭터를 생성합니다 것을 의미한다 표준 mbstowcs() 인터페이스에 NULL 포인터를 전달하여 정확히 얼마나 많은 와이드 문자가 생성되는지 알아 내야하지만 Android에서는 도움이되지 않습니다.) 다음과 같이 작동합니다 :

size_t n = mbstowcs(NULL, src, 0) + 1; 

전달되어야하는 n의 값은 종료 널 너비 문자를 포함하여 dest 포인터를 통해 작성되어야하는 최대 문자 수입니다.

그러나 Android 용으로 성공적으로 컴파일 된 libiconv을 사용해야합니다. 이 도구를 사용하면 원하는 원본 및 대상 문자 집합을 명시 적으로 선택할 수 있으며이 문제에 훨씬 더 적합합니다.

+0

테스트 할 때 n은 항상 1입니다. 첫 번째 줄의 의미는 무엇입니까? – Aaron

+0

@Aaron : 죄송합니다. 실제로 mbstowcs()에 대한 glibc 확장이며 Android에서는 사용할 수 없습니다 - 답변을 업데이트했습니다. – caf

관련 문제