1. ホーム
  2. c++

[解決済み】MultiByteToWideCharの使い方は?

2022-02-17 04:24:56

質問

通常の stringwstring . このために、私は Windows API 関数を使おうとしています。 MultiByteToWideChar . しかし、それは私のために動作しません。

以下は、私が行ったことです。

string x = "This is c++ not java";
wstring Wstring;
MultiByteToWideChar( CP_UTF8 , 0 , x.c_str() , x.size() , &Wstring , 0 ); 

最後の行は、コンパイラーエラーを発生させます。

'MultiByteToWideChar' : cannot convert parameter 5 from 'std::wstring *' to 'LPWSTR'

このエラーを修正するにはどうしたらいいですか?

また、引数の cchWideChar ? 0でいいんですか?

解決方法は?

を呼び出す必要があります。 MultiByteToWideChar を2回実行します。

  1. の最初の呼び出しは MultiByteToWideChar は、ワイド文字列に必要なバッファサイズを求めるために使用されます。を見てください。 マイクロソフトのドキュメント ;と記載されています。

    この関数が成功し cchWideChar が 0 の場合、戻り値は lpWideCharStr .

    このように MultiByteToWideChar は、必要なサイズを与えるために、最後のパラメータの値として0を渡します。 cchWideChar . また NULL をその前のものと同じにします。 lpWideCharStr .

  2. 前のステップのバッファサイズを使用して、ワイド文字列を収容するのに十分な大きさの非構成バッファを取得します。このバッファを MultiByteToWideChar . そして今回、最後の引数は0ではなく、実際のバッファのサイズにする必要があります。

大雑把な例です。

int wchars_num = MultiByteToWideChar( CP_UTF8 , 0 , x.c_str() , -1, NULL , 0 );
wchar_t* wstr = new wchar_t[wchars_num];
MultiByteToWideChar( CP_UTF8 , 0 , x.c_str() , -1, wstr , wchars_num );
// do whatever with wstr
delete[] wstr;

また、-1 を使っていることに注意してください。 cbMultiByte 引数で指定します。これにより、結果の文字列はヌル終端となり、それらを処理する手間が省けます。