Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Отслеживает состояние преобразования многобайтового символа.
Синтаксис
int mbsinit(
const mbstate_t* ps
);
Параметры
ps
Указатель на переменную mbstate_t .
Возвращаемое значение
Ненулевое значение, если ps NULL оно находится или не находится в середине преобразования.
Замечания
При использовании одной из функций ANSI, принимающей mbstate_t указатель, передайте адрес возвращаемой 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