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
に格納される null ワイド文字を表すマルチバイト文字 wchar
完了します。
1 から count
、次の count
以下のバイトが有効なマルチバイト文字を完了します。 返される値は、マルチバイト文字を完成するのに必要なバイト数です。 wchar
が null ポインターでない場合、等価のワイド文字はwchar
に格納されます。
(size_t)(-1): エンコーディング エラーが発生しました。 次の count
以下のバイトは、完全で有効なマルチバイト文字には影響しません。 この場合、errno
が EILSEQ に設定され、mbstate
の変換のシフト状態は指定されていません。
(size_t)(-2)次の count
バイトは、不完全だが有効な可能性のあるマルチバイト文字に寄与し、すべての count
バイトが処理されています。 wchar
に値は格納されませんが、関数を再開するために mbstate
が更新されます。
解説
mbchar
が null ポインターの場合、関数は呼び出しに相当します。
mbrtowc(NULL, "", 1, &mbstate)
この場合、 wchar
引数と count
引数の値は無視されます。
mbchar
が null ポインターでない場合、関数は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> |