mbsinit
Suit l’état d’une conversion en caractères multioctets.
Syntaxe
int mbsinit(
const mbstate_t* ps
);
Paramètres
ps
Pointeur vers une mbstate_t
variable.
Valeur retournée
Différent de zéro si ps
c’est ou s’il n’est NULL
pas au milieu d’une conversion.
Notes
Lorsque vous utilisez l’une des fonctions ANSI qui accepte un mbstate_t
pointeur, la transmission de l’adresse de vos mbstate_t
informations retourne des informations sur la conversion du dernier octet dans la mémoire tampon.
La page de codes appropriée doit être installée pour prendre en charge vos caractères multioctets.
Exemple
// 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);
}
Exemple de sortie
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