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