web-dev-qa-db-ja.com

std :: stringをconst wchar_tに変換したい*

方法はありますか?私のコンピューターはAMD64です。

::std::string str;
BOOL loadU(const wchar_t* lpszPathName, int flag = 0);

私が使用したとき:

loadU(&str);

vS2005コンパイラはこう言います:

Error 7 error C2664:: cannot convert parameter 1 from 'std::string *__w64 ' to 'const wchar_t *'

どうすればいいですか?

53
user25749

Std :: wstringオブジェクトがある場合は、c_str()を呼び出してwchar_t*を取得できます。

std::wstring name( L"Steve Nash" );
const wchar_t* szName = name.c_str();

ただし、狭い文字列を操作しているため、最初に幅を広げる必要があります。ここにはさまざまなオプションがあります。 1つは、Windowsの組み込み MultiByteToWideChar ルーチンを使用することです。これにより、wchar_t*と同等のLPWSTRが得られます。

41
Matt Dillard

最初にstd :: wstringに変換します:

std::wstring widestr = std::wstring(str.begin(), str.end());

次に、C文字列を取得します。

const wchar_t* widecstr = widestr.c_str();

これはASCII文字列に対してのみ機能しますが、基になる文字列がUTF-8エンコードされている場合は機能しません。MultiByteToWideChar()などの変換ルーチンを使用すると、このシナリオが適切に処理されます。

90
marijne

ATLテキスト変換マクロを使用して、狭い(char)文字列を広い(wchar_t)文字列に変換できます。たとえば、std :: stringを変換するには:

#include <atlconv.h>
...
std::string str = "Hello, world!";
CA2W pszWide(str.c_str());
loadU(pszWide);

コードページを指定することもできます。そのため、std :: stringにUTF-8文字が含まれている場合は、次を使用できます。

CA2W pszWide(str.c_str(), CP_UTF8);

非常に便利ですが、Windowsのみです。

9
Rob

Linux/Unixを使用している場合は、GNU C(ISO C 90から)で定義されているmbstowcs()およびwcstombs()を参照してください。

  • mbsは「Multi Bytes String」の略で、基本的には通常のゼロで終わるC文字列です。

  • wcsはWide Char Stringの略で、wchar_tの配列です。

ワイド文字の背景の詳細​​については、glibcのドキュメント here を参照してください。

4
kriss