2008-10-29 3 views
48

Есть ли какой-нибудь метод? Мой компьютер AMD64.Я хочу преобразовать std :: string в const wchar_t *

::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 *' 

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

ответ

35

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

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

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

+0

Или просто введите текст строки «var var»: « – cybermonkey 2014-11-09 17:13:20

+2

@ ʎǝʞuoɯɹǝqʎɔ: Вы имеете в виду« wstring var = L »text»; ` – 2015-03-12 20:45:43

75

сначала преобразовать его в StD :: wstring:

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

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

const wchar_t* widecstr = widestr.c_str(); 

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

+3

Это должно отлично работать для строк ASCII, но это не сработает, если базовые строка кодируется в кодировке UTF-8. Использование такой процедуры преобразования, как MultiByteToWideChar(), гарантирует правильность обработки этого сценария. – 2008-10-29 13:50:05

+0

Вы должны использовать MultiByteToWideChar с правильной кодовой страницей.Чтобы быть точным, необходимы два вызова: первый, чтобы получить требуемую длину целевой строки wchar_t, а второй - для преобразования строки символов в строку wchar_t. – 2008-10-30 08:56:37

8

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

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

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

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

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

4

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

  • mbs stand for «Multi Bytes String» и в основном является обычной строкой C с нулевым завершением.

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

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