次の方法で共有

Facebook x.com LinkedIn 電子メール

mbsinit

マルチバイト文字の変換状態を追跡します。

int mbsinit(
 const mbstate_t* ps
);

パラメーター

  • ps
    mbstate_t 変数へのポインター。

戻り値

ps が NULL の場合、または変換の途中でない場合は 0 以外の値を返します。

解説

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

参照

参照

バイト分類


  • Last updated on 2011年08月09日