mbrtowc

現在のロケールのマルチバイト文字を、それに対応するワイド文字に変換します。マルチバイト文字の途中から再開することが可能です。

構文

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

パラメーター

wchar
変換されたワイド文字の文字列を受け取るワイド文字のアドレス (型 wchar_t)。 ワイド文字を返す必要がない場合、この値は null ポインターを指定できます。

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

count
チェックするバイト数。

mbstate
変換状態のオブジェクトへのポインター。 この値が null ポインターの場合、関数は静的な内部変換状態オブジェクトを使用します。 内部 mbstate_t オブジェクトはスレッド セーフではないので、常に独自 mbstate の引数を渡すことをお勧めします。

戻り値

次のいずれかの値:

0 次countのバイト以下のバイトは、null ポインターでない場合wcharに格納される wcharnull ワイド文字を表すマルチバイト文字を完了します。

1 ~ count(次のバイト以下のバイトを含む count ) は、有効なマルチバイト文字を完了します。 返される値は、マルチバイト文字を完成するのに必要なバイト数です。 等価のワイド文字は、null ポインターでない場合wcharは格納されますwchar

(size_t)(-1): エンコーディング エラーが発生しました。 次 count のバイト以下のバイトは、完全で有効なマルチバイト文字には影響しません。 この場合、errno が EILSEQ に設定され、mbstate の変換のシフト状態は指定されていません。

(size_t)(-2)次 count のバイトは不完全だが有効な可能性のあるマルチバイト文字に寄与し、すべての count バイトが処理されています。 wchar に値は格納されませんが、関数を再開するために mbstate が更新されます。

解説

mbchar が null ポインターの場合、関数は呼び出しに相当します。

mbrtowc(NULL, "", 1, &mbstate)

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

null ポインターでない場合mbchar、関数はバイトmbcharを調べてcount、次のマルチバイト文字を完了するために必要なバイト数を判断します。 次の文字が有効な場合は、対応するマルチバイト文字が null ポインターでない場合に wchar 格納されます。 文字が対応するワイド null 文字の場合、mbstate の結果の状態は初期の変換状態になります。

この関数はmbrtowc、再起動可能性によって異_mbtowc_lなりますmbtowc。 同じ関数または再開可能な他の関数の後続の呼び出しのために、変換状態が mbstate に格納されます。 再開可能な関数と再開不可能な関数を混用した場合、結果は未定義です。 たとえば、wcsrlen の代わりに wcslen の後続の呼び出しが使用されている場合、アプリケーションは wcsrtombs の代わりに wcstombs を使用する必要があります。

既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT のグローバル状態」を参照してください

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

// 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>

関連項目

データ変換
ロケール
マルチバイト文字シーケンスの解釈