Eu quero converter std :: string em uma wchar_t const *
Pergunta
Existe algum método? Meu computador é AMD64.
::std::string str;
BOOL loadU(const wchar_t* lpszPathName, int flag = 0);
Quando eu usei:
loadU(&str);
o compilador VS2005 diz:
Error 7 error C2664:: cannot convert parameter 1 from 'std::string *__w64 ' to 'const wchar_t *'
Como posso fazê-lo?
Solução
Se você tem um objeto std :: wstring, você pode chamar c_str()
sobre ele para obter uma wchar_t*
:
std::wstring name( L"Steve Nash" );
const wchar_t* szName = name.c_str();
Uma vez que você estiver operando em uma corda estreita, no entanto, você primeiro precisa ampliá-lo. Existem várias opções aqui; uma é usar o Windows' built-in MultiByteToWideChar
rotina. Isso lhe dará uma LPWSTR
, o que equivale a wchar_t*
.
Outras dicas
Primeiro convertê-lo para std :: wstring:
std::wstring widestr = std::wstring(str.begin(), str.end());
Em seguida, obter a seqüência C:
const wchar_t* widecstr = widestr.c_str();
Isso só funciona para strings ASCII, mas não vai funcionar se a cadeia subjacente é UTF-8 codificado. Usando uma rotina de conversão como MultiByteToWideChar () garante que este cenário é tratada adequadamente.
Você pode usar as macros de conversão de texto ATL para converter uma cadeia estreita (char) para uma ampla (wchar_t) um. Por exemplo, para converter um std :: string:
#include <atlconv.h>
...
std::string str = "Hello, world!";
CA2W pszWide(str.c_str());
loadU(pszWide);
Você também pode especificar uma página de código, por isso, se o seu std :: string contém caracteres UTF-8 que você pode usar:
CA2W pszWide(str.c_str(), CP_UTF8);
Muito útil, mas somente para Windows.
Se você estiver em Linux / Unix ter um olhar para mbstowcs () e wcstombs () definidos no GNU C (a partir de ISO C 90).
-
MBS estar para "Multi Bytes String" e é basicamente zero habitual string terminada C.
-
wcs representam Ampla Char Cordas e é uma matriz de wchar_t.
Para mais detalhes do fundo em caracteres largos ter um olhar para a documentação glibc aqui .