次の方法で共有


mbrtowc

更新 : 2007 年 11 月

マルチバイト文字を対応するワイド文字に変換します。

size_t mbrtowc(
   wchar_t *wchar,
   const char *mbchar,
   size_t count,
   mbstate_t mbstate
);

パラメータ

  • wchar
    変換されたワイド文字列を受け取るワイド文字のアドレス (wchar_t 型)。ワイド文字を返す必要がない場合、この値は NULL になります。

  • mbchar
    バイト シーケンス (マルチバイト文字) のアドレス。

  • count
    確認するバイト数。

  • mbstate
    変換状態。この値が NULL の場合、内部の変換状態カテゴリが使用されます。

戻り値

  • 0
    次の count 数以下のバイトが NULL ワイド文字を表すマルチバイト文字を形成する場合。

  • > 0
    次の count 数以下のバイトが有効なマルチバイト文字を形成する場合、マルチバイト文字を形成するバイト数が返されます。

  • -1
    エンコード エラーが発生した場合は、次の count 数以下のバイトが完全で有効なマルチバイト文字を形成しないため、errno 値は EILSEQ になり、変換状態はあいまいになります。

  • -2
    次の count 数以下のバイトが完全なマルチバイトを形成せず、すべてのカウント バイトが処理された場合。

解説

wchar が NULL の場合、この関数は次の呼び出しと同じです。

mbrtowc(NULL, NULL, 1, mbstate)

この場合、wchar 引数と count 引数の値は無視されます。

wchar が NULL の場合、この関数は mbchar で始まる count バイトを調べて、次のマルチバイト文字を形成するために必要なバイト数を特定します。次の文字が有効な場合、対応するマルチバイト文字が wchar に格納され、無効な場合は NULL が格納されます。文字が対応する NULL ワイド文字の場合、結果の状態は初期状態になります。

mbrtowc 関数は、再起動できるかどうかに関して、mbtowc、_mbtowc_l と異なります。変換状態は、同じまたは他の再起動可能な関数の後続の呼び出しのために mbstate に格納されます。再起動可能な関数と再起動不可能な関数を混在させた場合は、予測できない結果になる可能性があります。たとえば、後で wcstombs ではなく wcsrtombs を呼び出す場合、アプリケーションは wcslen ではなく wcsrlen を使用します。

使用例

マルチバイト文字を対応するワイド文字に変換します。

// crt_mbrtowc.cpp

#include <stdio.h>
#include <mbctype.h>
#include <string.h>
#include <locale.h>
#include <wchar.h>

#define BUF_SIZE 100

int Sample(char* szIn, wchar_t* wcOut, int nMax)
{
    mbstate_t   state = {0}; // Initial state
    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;
    
    // Sets all locale to French_Canada.1252
    szLocal = setlocale(LC_ALL, "French_Canada.1252");
    if (!szLocal)
    {
        printf("The fuction setlocale(LC_ALL, \"French_Canada.1252\") failed!\n");
        return 1;
    }

    printf("Locale set to: \"%s\"\n", szLocal);

    // Sets the code page associated current locale's code page
    // from a previous call to setlocale.
    if (_setmbcp(_MB_CP_SBCS) == -1)
    {
        printf("The fuction _setmbcp(_MB_CP_SBCS) failed!");
        return 1;
    }

    while ((mbCur < mbEnd) && (wcCur < wcEnd))
    {
        //
        nConvResult = mbrtowc(wcCur, mbCur, 1, &state);
        switch (nConvResult)
        {
            case 0:
            {  // done
                printf("Conversion succeeded!\nMultibyte String: ");
                printf(szIn);
                printf("\nWC String: ");
                wprintf(wcOut);
                printf("\n");
                mbCur = mbEnd;
                break;
            }

            case -1:
            {  // encoding error
                printf("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) // The multibyte should never be larger than 2
                {
                    printf("Error: The size of the converted multibyte is %d.\n", nConvResult);
                }

                ++nmbLen;
                ++nwcLen;
                ++wcCur;
                ++mbCur;
            break;
            }
        }
    }

   return 0;
}

int main(int argc, char* argv[])
{
    char    mbBuf[BUF_SIZE] = "AaBbCc\x9A\x8B\xE0\xEF\xF0xXyYzZ";
    wchar_t wcBuf[BUF_SIZE] = {L''};

    return Sample(mbBuf, wcBuf, BUF_SIZE);
}

出力例

Locale set to: "French_Canada.1252"
Conversion succeeded!
Multibyte String: AaBbCcÜïα∩≡xXyYzZ
WC String: AaBbCcÜïα∩≡xXyYzZ

必要条件

ルーチン

必須ヘッダー

mbrtowc

<wchar.h>

.NET Framework の相当するアイテム

適用できません。標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。

参照

参照

データ変換

ロケール

マルチバイト文字のシーケンスの解釈