Я хочу преобразовать 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 *'

как я могу это сделать?

4 ответов


если у вас есть объект std::wstring, вы можете вызвать c_str() на нем получить wchar_t*:

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

поскольку вы работаете на узкой строке, однако, вам сначала нужно будет ее расширить. Здесь есть различные варианты; один из них-использовать встроенный Windows MultiByteToWideChar режим. Это даст вам LPWSTR, что эквивалентно wchar_t*.


сначала преобразуйте его в std:: wstring:

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

затем получите строку C:

const wchar_t* widecstr = widestr.c_str();

это работает только для строк ASCII, но это не будет работать, если базовая строка кодируется UTF-8. Использование процедуры преобразования, такой как MultiByteToWideChar (), гарантирует правильную обработку этого сценария.


вы можете использовать макросы преобразования текста ATL для преобразования узкой (char) строки в широкую (wchar_t). Например, чтобы преобразовать std:: string:

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

вы также можете указать кодовую страницу, поэтому, если ваша строка std::содержит символы UTF-8, вы можете использовать:

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

очень полезно, но только для Windows.


Если вы находитесь в Linux / Unix, посмотрите на mbstowcs() и wcstombs (), определенные в GNU C (из ISO C 90).

  • mbs означает "строка с несколькими байтами"и в основном является обычной строкой с нулевым завершением.

  • WCS означает широкую строку символов и представляет собой массив wchar_t.

для получения дополнительной информации о широких символах посмотрите документацию glibc здесь.