70
votes

I had the code:

std::string st = "SomeText";
...
std::cout << st;

and that worked fine. But now my team wants to move to wstring. So I tried:

std::wstring st = "SomeText";
...
std::cout << st;

but this gave me a compilation error:

Error 1 error C2664: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(const std::basic_string<_Elem,_Traits,_Ax> &)' : cannot convert parameter 1 from 'const char [8]' to 'const std::basic_string<_Elem,_Traits,_Ax> &' D:...\TestModule1.cpp 28 1 TestModule1

After searching the web I read that I should define it as:

std::wstring st = L"SomeText"; // Notice the "L"
...
std::cout << st;

this compiled but prints "0000000000012342" instead of "SomeText".

What am I doing wrong ?

4
Consider using ICU unicode library - link. It supports unicode and has many usefull features. especially if you want to manipulate those strings.WeaselFox
@Weasel: Why in the world would you need a separate library to work with Unicode strings?Cody Gray♦
from my experience its much better to use a separate library to manipulate wchar strings (search, replace etc) or other multi-byte strings.WeaselFox
Thanks, but I just needed to use wcout instead of cout (-:Roee Gavirel

4 Answers

122
votes

To display a wstring you also need a wide version of cout - wcout.

std::wstring st = L"SomeText";
...
std::wcout << st; 
17
votes

Use std::wcout instead of std::cout.

8
votes

This answer apply to "C++/CLI" tag, and related Windows C++ console.

If you got multi-bytes characters in std::wstring, two more things need to be done to make it work:

  1. Include headers
    #include <io.h>
    #include <fcntl.h>
  2. Set stdout mode
    _setmode(_fileno(stdout), _O_U16TEXT)

Result: Multi-bytes console

6
votes

try to use use std::wcout<<st it will fix your problem.

std::wstring st = "SomeText";
...
std::wcout << st;