I want to convert std::string into a const wchar_t *

159,388

Solution 1

If you have a std::wstring object, you can call c_str() on it to get a wchar_t*:

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

Since you are operating on a narrow string, however, you would first need to widen it. There are various options here; one is to use Windows' built-in MultiByteToWideChar routine. That will give you an LPWSTR, which is equivalent to wchar_t*.

Solution 2

First convert it to std::wstring:

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

Then get the C string:

const wchar_t* widecstr = widestr.c_str();

This only works for ASCII strings, but it will not work if the underlying string is UTF-8 encoded. Using a conversion routine like MultiByteToWideChar() ensures that this scenario is handled properly.

Solution 3

You can use the ATL text conversion macros to convert a narrow (char) string to a wide (wchar_t) one. For example, to convert a std::string:

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

You can also specify a code page, so if your std::string contains UTF-8 chars you can use:

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

Very useful but Windows only.

Solution 4

If you are on Linux/Unix have a look at mbstowcs() and wcstombs() defined in GNU C (from ISO C 90).

  • mbs stand for "Multi Bytes String" and is basically the usual zero terminated C string.

  • wcs stand for Wide Char String and is an array of wchar_t.

For more background details on wide chars have a look at glibc documentation here.

Share:
159,388
user25749
Author by

user25749

Updated on July 08, 2022

Comments

  • user25749
    user25749 almost 2 years

    Is there any method? My computer is AMD64.

    ::std::string str;
    BOOL loadU(const wchar_t* lpszPathName, int flag = 0);
    

    When I used:

    loadU(&str);
    

    the VS2005 compiler says:

    Error 7 error C2664:: cannot convert parameter 1 from 'std::string *__w64 ' to 'const wchar_t *'
    

    How can I do it?

  • Matt Dillard
    Matt Dillard over 15 years
    This should work fine for ASCII strings, but it will not work if the underlying string is UTF-8 encoded. Using a conversion routine like MultiByteToWideChar() ensures that this scenario is handled properly.
  • Nick
    Nick over 15 years
    You probably want CA2CW. You might also want to add a basic explanation for the macro naming convention (eg: Const Ascii -> Const Wchar).
  • Johann Gerell
    Johann Gerell over 15 years
    You should use MultiByteToWideChar with correct codepage. To be precise, two calls to it are needed: the first to get the required length of the target wchar_t string and the second to convert the char string to the wchar_t string.
  • Rob
    Rob over 15 years
    There is no CA2CW conversion function. There is a CA2CT version but this simply calls CA2W. See <atlconv.h> for a full list.
  • MSalters
    MSalters over 15 years
    It will only work if wchar_t is Unicode and char is Latin-1 or ASSCII. The first 256 character values of Unicode exactly match Latin-1; the first 128 characters of Latin-1 exactly match ASCII.
  • chaosTechnician
    chaosTechnician almost 13 years
    This was the quick fix I needed for my situation. Thanks!
  • ceztko
    ceztko almost 13 years
    Incredibly useful. In my case, only #include <atlstr.h> worked, while #include <atlconv.h> didn't. Dunno why.
  • Mooing Duck
    Mooing Duck about 9 years
    @ʎǝʞuoɯɹǝqʎɔ: You mean wstring var = L"text";
  • Mooing Duck
    Mooing Duck about 9 years
    I would also recommend CA2WEX instead, which bypasses potential stack overruns.
  • Mooing Duck
    Mooing Duck about 9 years
    I believe those are in C standard; either way, they're in Windows too: msdn.microsoft.com/en-us/library/k1f9b8cy.aspx
  • Hani Goc
    Hani Goc over 8 years
    cannot convert ‘const char*’ to ‘wchar_t*’
  • Wakan Tanka
    Wakan Tanka over 7 years
    this gives me an error: cannot convert from 'const wchar_t *' to 'wchar_t *' I had to use: const wchar_t* widecstr = widestr.c_str();