MultiByteToWideChar 関数 (stringapiset.h)

文字列を UTF-16 (ワイド文字) 文字列にマップします。 文字列は必ずしもマルチバイト文字セットからのものではありません。

注意 multiByteToWideChar 関数を誤って使用すると、アプリケーションのセキュリティが損なわれる可能性があります。 lpMultiByteStr によって示される入力バッファーのサイズが文字列内のバイト数と等しいのに対し、lpWideCharStr 示される出力バッファーのサイズは文字数と等しいため、この関数を呼び出すとバッファー オーバーランが発生する可能性があります。 バッファー オーバーランを回避するには、バッファーが受け取るデータ型に適したバッファー サイズをアプリケーションで指定する必要があります。 詳細については、「セキュリティに関する考慮事項: 国際機能」を参照してください。
 
ANSI コード ページは、異なるコンピューターで異なる場合があります。また、1 台のコンピューターで変更すると、データが破損する可能性があります。 最も一貫性のある結果を得るには、従来の標準またはデータ形式で Unicode の使用が妨げされない限り、アプリケーションでは特定のコード ページではなく UTF-8 や UTF-16 などの Unicode を使用する必要があります。 Unicode を使用できない場合、アプリケーションでは、プロトコルで許可されている場合に、適切なエンコード名でデータ ストリームにタグ付けする必要があります。 HTML ファイルと XML ファイルではタグ付けが可能ですが、テキスト ファイルではタグ付けできません。
 

構文

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

変換の実行に使用するコード ページ。 このパラメーターは、オペレーティング システムにインストールまたは使用できる任意のコード ページの値に設定できます。 コード ページの一覧については、「コード ページ識別子」を参照してください。 アプリケーションでは、次の表に示す値のいずれかを指定することもできます。

価値 意味
CP_ACP
システムの既定の Windows ANSI コード ページ。
この値は、同じネットワーク上でも、異なるコンピューターで異なる場合があります。 同じコンピューターで変更でき、保存されたデータが回復不能に破損する可能性があります。 この値は一時的な使用のみを目的としており、永続的ストレージでは可能であれば UTF-16 または UTF-8 を使用する必要があります。
 
CP_MACCP
現在のシステム Macintosh コード ページ。
この値は、同じネットワーク上でも、異なるコンピューターで異なる場合があります。 同じコンピューターで変更でき、保存されたデータが回復不能に破損する可能性があります。 この値は一時的な使用のみを目的としており、永続的ストレージでは可能であれば UTF-16 または UTF-8 を使用する必要があります。
 
この値は主にレガシ コードで使用され、最新の Macintosh コンピューターではエンコードに Unicode が使用されるため、通常は必要ありません。
 
CP_OEMCP
現在のシステム OEM コード ページ。
この値は、同じネットワーク上でも、異なるコンピューターで異なる場合があります。 同じコンピューターで変更でき、保存されたデータが回復不能に破損する可能性があります。 この値は一時的な使用のみを目的としており、永続的ストレージでは可能であれば UTF-16 または UTF-8 を使用する必要があります。
 
CP_SYMBOL
シンボル コード ページ (42)。
CP_THREAD_ACP
現在のスレッドの Windows ANSI コード ページ。
この値は、同じネットワーク上でも、異なるコンピューターで異なる場合があります。 同じコンピューターで変更でき、保存されたデータが回復不能に破損する可能性があります。 この値は一時的な使用のみを目的としており、永続的ストレージでは可能であれば UTF-16 または UTF-8 を使用する必要があります。
 
CP_UTF7
UTF-7。 この値は、7 ビットのトランスポート メカニズムによって強制される場合にのみ使用します。 UTF-8 を使用することをお勧めします。
CP_UTF8
UTF-8。

[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 を 呼び出すと、ERROR_NO_UNICODE_TRANSLATIONが返されます。
MB_PRECOMPOSED
デフォルト;MB_COMPOSITEでは使用しないでください。 必ず、事前計算済み文字、つまり、基本文字または非スペース文字の組み合わせに対して 1 つの文字値を持つ文字を使用します。 たとえば、文字 è では、e は基本文字で、アクセント のグレーブ マークは非スペース文字です。 文字に対して 1 つの Unicode コード ポイントが定義されている場合、アプリケーションでは、別の基本文字と非スペース文字の代わりに使用する必要があります。 たとえば、Ä は単一の Unicode コード ポイントのラテン大文字 A WITH DIAERESIS (U+00C4) で表されます。
MB_USEGLYPHCHARS
コントロール文字の代わりにグリフ文字を使用します。

以下に示すコード ページでは、dwFlags に設定する必要があります。 それ以外の場合、関数は ERROR_INVALID_FLAGSで失敗します。

  • 50220
  • 50221
  • 50222
  • 50225
  • 50227
  • 50229
  • 57002 から 57011
  • 65000 (UTF-7)
  • 42 (記号)

手記

 UTF-8 またはコード ページ 54936 (GB18030、Windows Vista 以降) の場合、dwFlags または MB_ERR_INVALID_CHARSに設定する必要があります。 それ以外の場合、関数は ERROR_INVALID_FLAGSで失敗します。

[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 によって示されるバッファーに書き込まれた文字数 返します。 関数が成功し、cchWideChar場合、戻り値は lpWideCharStrで示されるバッファーに必要なサイズ (文字数) 。 無効なシーケンスが入力されたときに MB_ERR_INVALID_CHARS フラグが戻り値に与える影響については、dwFlagsも参照してください。

成功しなかった場合、関数は 0 を返します。 拡張エラー情報を取得するために、アプリケーションは GetLastError呼び出すことができます。これは、次のいずれかのエラー コードを返すことができます。

  • ERROR_INSUFFICIENT_BUFFER: 指定されたバッファー サイズが十分な大きさではなかったか、誤って NULLに設定されました。
  • ERROR_INVALID_FLAGS: フラグに指定された値が無効でした。
  • ERROR_INVALID_PARAMETER: パラメーター値のいずれかが無効でした。
  • ERROR_NO_UNICODE_TRANSLATION: 文字列に Unicode が無効です。

備考

この関数の既定の動作は、入力文字列の事前計算済みの形式に変換することです。 事前計算済みフォームが存在しない場合、関数は複合フォームへの変換を試みます。

ほとんどの入力データは既に構成されているため、MB_PRECOMPOSED フラグを使用すると、ほとんどのコード ページにはほとんど影響しません。 MultiByteToWideCharで変換した後 NormalizeString を呼び出 検討してください。 NormalizeString は、より正確で標準的で一貫性のあるデータを提供し、高速にすることもできます。 NormalizeStringに渡される NORM_FORM 列挙体の場合、NormalizC はMB_PRECOMPOSEDに対応し、NormalizD はMB_COMPOSITEに対応します。

上記の注意で説明したように、必要なサイズを取得するためにこの関数が最初に 0 に設定 cchWideChar で呼び出されない場合は、出力バッファーを簡単にオーバーランできます。 MB_COMPOSITE フラグを使用する場合は、各入力文字に対して 3 文字以上の長さにできます。

lpMultiByteStr ポインターと lpWideCharStr ポインター は同じにすることはできません。 同じ場合、関数は失敗し、GetLastError はERROR_INVALID_PARAMETER値を返します。

multiByteToWideChar 、入力文字列の長さが null 文字を終了せずに明示的に指定されている場合、出力文字列を null で終了しません。 この関数の出力文字列を null で終了するには、アプリケーションは -1 を渡すか、入力文字列の終端の null 文字を明示的にカウントする必要があります。

MB_ERR_INVALID_CHARSが設定されていて、ソース文字列で無効な文字が検出された場合、関数は失敗します。 無効な文字は次のいずれかです。

  • ソース文字列の既定の文字ではないが、MB_ERR_INVALID_CHARSが設定されていない場合に既定の文字に変換される文字。
  • DBCS ストリングの場合は、先頭バイトを持ち、有効な証跡バイトを持たない文字。

Windows Vista 以降、この関数は UTF-8 および UTF-16 の Unicode 4.1 仕様に完全に準拠しています。 以前のオペレーティング システムで使用される関数は、サロゲート 一方のサロゲート 半分または不一致のサロゲート ペアをエンコードまたはデコードします。 この動作に依存してランダムな非テキスト バイナリ データをエンコードする以前のバージョンの Windows で記述されたコードでは、問題が発生する可能性があります。 ただし、有効な UTF-8 文字列でこの関数を使用するコードは、以前の Windows オペレーティング システムと同じように動作します。

Windows XP: UTF-8 文字の最短形式バージョンのセキュリティの問題を防ぐために、MultiByteToWideChar これらの文字を削除します。

Windows 8 以降: multiByteToWideCharは、で宣言されています。 Windows 8 より前は、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