Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Затем введите строку C:

wchar_t* widecstr = widestr.c_str();

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

Ответ 3

Вы можете использовать макросы преобразования текста 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.

Ответ 4

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

  • mbs означает "Multi Bytes String" и в основном является обычной строкой C. с завершающим нулем.

  • wcs стоит для Wide Char String и представляет собой массив wchar_t.

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