mbrtowc
はのワイド文字バージョンとマルチバイトの文字を変換します。
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 バイトを調べます。次の文字が有効な場合対応するマルチバイト文字が null である wchar に格納されます。文字に対応するワイド Null 文字の場合結果の変換は初期状態です。
mbrtowc の関数は restartability によって mbtowc、_mbtowc_l とは異なります。変換は同じ状態またはそのほかの restartable 関数への後続の呼び出しの mbstate に格納されます。結果は restartable と nonrestartable 関数の使用を使用すると未定義です。たとえばアプリケーションが wcsrtombs に wcslen ではなく wcstombs の代わりに使用されている場合後続の呼び出し 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 を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。