Я хочу конвертировать std :: string в const wchar_t * - PullRequest
53 голосов
/ 29 октября 2008

Есть ли способ? Мой компьютер 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 ]

86 голосов
/ 29 октября 2008

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

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

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

const wchar_t* widecstr = widestr.c_str();

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

40 голосов
/ 29 октября 2008

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

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

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

9 голосов
/ 29 октября 2008

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

4 голосов
/ 14 января 2010

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

  • mbs означает «многобайтовую строку» и, по сути, является обычной строкой Си с нулем в конце.

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

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

...