MultiByteToWideChar 関数 (stringapiset.h)
文字列を UTF-16 (ワイド文字) 文字列にマップします。 文字列は必ずしもマルチバイト文字セットからのものではありません。
構文
int MultiByteToWideChar(
[in] UINT CodePage,
[in] DWORD dwFlags,
[in] _In_NLS_string_(cbMultiByte)LPCCH lpMultiByteStr,
[in] int cbMultiByte,
[out, optional] LPWSTR lpWideCharStr,
[in] int cchWideChar
);
パラメーター
[in] CodePage
変換の実行に使用するコード ページ。 このパラメーターは、オペレーティング システムにインストールまたは使用できる任意のコード ページの値に設定できます。 コード ページの一覧については、「コード ページ識別子」を参照してください。 アプリケーションでは、次の表に示す値のいずれかを指定することもできます。
[in] dwFlags
変換の種類を示すフラグ。 アプリケーションでは、次の値の組み合わせを指定でき、MB_PRECOMPOSEDが既定値になります。 MB_PRECOMPOSEDとMB_COMPOSITEは相互に排他的です。 MB_USEGLYPHCHARSとMB_ERR_INVALID_CHARSは、他のフラグの状態に関係なく設定できます。
価値 | 意味 |
---|---|
MB_COMPOSITE | 分解文字 、つまり、基本文字と 1 つ以上の非スペース文字がそれぞれ個別のコード ポイント値を持つ文字を常に使用します。 たとえば、Ä は A + ̈: ラテン大文字 A (U+0041) + COMBINING DIAERESIS (U+0308) で表されます。 このフラグは、MB_PRECOMPOSEDでは使用できないことに注意してください。 |
MB_ERR_INVALID_CHARS | 無効な入力文字が検出された場合は失敗します。 Windows Vista 以降では、アプリケーションがこのフラグを設定しない場合、この関数は無効なコード ポイントを削除せず、代わりに無効なシーケンスを U+FFFD (指定されたコードページに適してエンコード) に置き換えます。 windows 2000 sp4 以降を 、Windows XP: このフラグが設定されていない場合、関数は自動的に無効なコード ポイントを削除します。 GetLastError を |
- MB_PRECOMPOSED
- MB_USEGLYPHCHARS
以下に示すコード ページでは、dwFlags
- 50220
- 50221
- 50222
- 50225
- 50227
- 50229
- 57002 から 57011
- 65000 (UTF-7)
- 42 (記号)
手記
UTF-8 またはコード ページ 54936 (GB18030、Windows Vista 以降) の場合、dwFlags
[in] lpMultiByteStr
変換する文字列へのポインター。
[in] cbMultiByte
lpMultiByteStr パラメーターによって示される文字列のサイズ (バイト単位)。 または、文字列が null で終わる場合は、このパラメーターを -1 に設定できます。 cbMultiByte
このパラメーターが -1 の場合、関数は入力文字列全体 (終端の null 文字を含む) を処理します。 そのため、結果の Unicode 文字列は終端の null 文字を持ち、関数によって返される長さにはこの文字が含まれます。
このパラメーターが正の整数に設定されている場合、関数は指定されたバイト数を正確に処理します。 指定されたサイズに終端の null 文字が含まれていない場合、結果の Unicode 文字列は null で終わるのではなく、返される長さにはこの文字は含まれません。
[out, optional] lpWideCharStr
変換された文字列を受け取るバッファーへのポインター。
[in] cchWideChar
lpWideCharStrで示されるバッファーのサイズ (文字単位)。 この値が 0
場合、関数は必要なバッファー サイズ (終端の null 文字を含む) を文字で返し、lpWideCharStr バッファーを使用しません。
戻り値
成功した場合に lpWideCharStr によって示されるバッファーに書き込まれた文字数
成功しなかった場合、関数は 0
を返します。 拡張エラー情報を取得するために、アプリケーションは GetLastError
-
ERROR_INSUFFICIENT_BUFFER: 指定されたバッファー サイズが十分な大きさではなかったか、誤って
NULL
に設定されました。 - ERROR_INVALID_FLAGS: フラグに指定された値が無効でした。
- ERROR_INVALID_PARAMETER: パラメーター値のいずれかが無効でした。
- ERROR_NO_UNICODE_TRANSLATION: 文字列に Unicode が無効です。
備考
この関数の既定の動作は、入力文字列の事前計算済みの形式に変換することです。 事前計算済みフォームが存在しない場合、関数は複合フォームへの変換を試みます。
ほとんどの入力データは既に構成されているため、MB_PRECOMPOSED フラグを使用すると、ほとんどのコード ページにはほとんど影響しません。 MultiByteToWideCharで変換した後
上記の注意で説明したように、必要なサイズを取得するためにこの関数が最初に 0
に設定 cchWideChar で呼び出されない場合は、出力バッファーを簡単にオーバーランできます。 MB_COMPOSITE フラグを使用する場合は、各入力文字に対して 3 文字以上の長さにできます。
lpMultiByteStr ポインターと lpWideCharStr ポインター
multiByteToWideChar
MB_ERR_INVALID_CHARSが設定されていて、ソース文字列で無効な文字が検出された場合、関数は失敗します。 無効な文字は次のいずれかです。
- ソース文字列の既定の文字ではないが、MB_ERR_INVALID_CHARSが設定されていない場合に既定の文字に変換される文字。
- DBCS ストリングの場合は、先頭バイトを持ち、有効な証跡バイトを持たない文字。
Windows Vista 以降、この関数は UTF-8 および UTF-16 の Unicode 4.1 仕様に完全に準拠しています。 以前のオペレーティング システムで使用される関数は、サロゲート 一方のサロゲート 半分または不一致のサロゲート ペアをエンコードまたはデコードします。 この動作に依存してランダムな非テキスト バイナリ データをエンコードする以前のバージョンの Windows で記述されたコードでは、問題が発生する可能性があります。 ただし、有効な UTF-8 文字列でこの関数を使用するコードは、以前の Windows オペレーティング システムと同じように動作します。
Winnls.h
で宣言されていました。
コード例
catch (std::exception e)
{
// Save in-memory logging buffer to a log file on error.
::std::wstring wideWhat;
if (e.what() != nullptr)
{
int convertResult = MultiByteToWideChar(CP_UTF8, 0, e.what(), (int)strlen(e.what()), NULL, 0);
if (convertResult <= 0)
{
wideWhat = L"Exception occurred: Failure to convert its message text using MultiByteToWideChar: convertResult=";
wideWhat += convertResult.ToString()->Data();
wideWhat += L" GetLastError()=";
wideWhat += GetLastError().ToString()->Data();
}
else
{
wideWhat.resize(convertResult + 10);
convertResult = MultiByteToWideChar(CP_UTF8, 0, e.what(), (int)strlen(e.what()), &wideWhat[0], (int)wideWhat.size());
if (convertResult <= 0)
{
wideWhat = L"Exception occurred: Failure to convert its message text using MultiByteToWideChar: convertResult=";
wideWhat += convertResult.ToString()->Data();
wideWhat += L" GetLastError()=";
wideWhat += GetLastError().ToString()->Data();
}
else
{
wideWhat.insert(0, L"Exception occurred: ");
}
}
}
else
{
wideWhat = L"Exception occurred: Unknown.";
}
Platform::String^ errorMessage = ref new Platform::String(wideWhat.c_str());
// The session added the channel at level Warning. Log the message at
// level Error which is above (more critical than) Warning, which
// means it will actually get logged.
_channel->LogMessage(errorMessage, LoggingLevel::Error);
SaveLogInMemoryToFileAsync().then([=](StorageFile^ logFile) {
_logFileGeneratedCount++;
StatusChanged(this, ref new LoggingScenarioEventArgs(LoggingScenarioEventType::LogFileGenerated, logFile->Path->Data()));
}).wait();
}
GitHub Windows ユニバーサル サンプル の例。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows 2000 Professional [デスクトップ アプリ |UWP アプリ] |
サポートされる最小サーバー | Windows 2000 Server [デスクトップ アプリ |UWP アプリ] |
ターゲット プラットフォーム の |
ウィンドウズ |
ヘッダー | stringapiset.h (Windows.h を含む) |
ライブラリ | Kernel32.lib |
DLL | Kernel32.dll |
関連項目
Unicode 関数と文字セット関数 を
Unicode および文字セット を
wideCharToMultiByte を
VBS エンクレーブ で使用できる Vertdll API