Я хочу преобразовать 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 *'
Как мне это сделать?
Решение
Если у вас есть объект 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 означает «многобайтовая строка» и по сути представляет собой обычную строку C с нулевым завершением.
wcs означает «широкая строка символов» и представляет собой массив wchar_t.
Более подробную информацию о широких символах можно найти в документации glibc. здесь.