mbsinit
멀티 바이트 문자 변환의 상태를 추적합니다.
구문
int mbsinit(
const mbstate_t* ps
);
매개 변수
ps
변수에 대한 포인터입니다 mbstate_t
.
반환 값
변환 중간에 0이 NULL
아니면 0 ps
이 아닙니다.
설명
포인터를 사용하는 mbstate_t
ANSI 함수 중 하나를 사용하는 경우 사용자의 주소를 전달하면 버퍼의 mbstate_t
마지막 바이트가 변환되었는지 여부에 대한 정보가 반환됩니다.
멀티바이트 문자를 지원하려면 적절한 코드 페이지를 설치해야 합니다.
예시
// crt_mbsinit.cpp
#include <stdio.h>
#include <mbctype.h>
#include <string.h>
#include <locale.h>
#include <cwchar>
#include <xlocinfo.h>
#define BUF_SIZE 0x40
wchar_t g_wcBuf[BUF_SIZE] = L"This a wc buffer that will be over written...";
char g_mbBuf[BUF_SIZE] = "AaBbCc\x9A\x8B\xE0\xEF\xF0xXyYzZ";
int g_nInit = strlen(g_mbBuf);
int MbsinitSample(char* szIn, wchar_t* wcOut, int nMax)
{
mbstate_t state = {0};
size_t nConvResult, nmbLen = 0, nwcLen = 0;
wchar_t* wcCur = wcOut;
wchar_t* wcEnd = wcCur + nMax;
const char* mbCur = szIn;
const char* mbEnd = mbCur + strlen(mbCur) + 1;
char* szLocal = setlocale(LC_ALL, "japanese");
printf("Locale set to: \"%s\"\n", szLocal);
if (_setmbcp(_MB_CP_LOCALE) != -1)
{
while ((mbCur < mbEnd) && (wcCur < wcEnd))
{
nConvResult = mbrtowc(wcCur, mbCur, 1, &state);
switch (nConvResult)
{
case 0:
{ // done
printf("Conversion succeeded!\nMB String: ");
printf(szIn);
printf("\nWC String: ");
wprintf(wcOut);
printf("\n");
mbCur = mbEnd;
break;
}
case -1:
{ // encoding error
printf("ERROR: The call to mbrtowc has detected an encoding error.\n");
mbCur = mbEnd;
break;
}
case -2:
{ // incomplete character
if (!mbsinit(&state))
{
printf("Currently in middle of mb conversion, state = %x\n", state);
// state will contain data regarding lead byte of mb character
}
++nmbLen;
++mbCur;
break;
}
default:
{
if (nConvResult > 2) // Microsoft mb should never be larger than 2
printf("ERROR: nConvResult = %d\n", nConvResult);
++nmbLen;
++nwcLen;
++wcCur;
++mbCur;
break;
}
}
}
}
else
printf("ERROR: _setmbcp(932) failed!");
return 0;
}
int main(int argc, char* argv[])
{
return MbsinitSample(g_mbBuf, g_wcBuf, BUF_SIZE);
}
샘플 출력
Locale set to: "Japanese_Japan.932"
Currently in middle of mb conversion, state = 9a
Currently in middle of mb conversion, state = e0
Currently in middle of mb conversion, state = f0
Conversion succeeded!
MB String: AaBbCcxXyYzZ
WC String: AaBbCcxXyYzZ