How to initialize and print a std::wstring?

C++C++ CliWstring

C++ Problem Overview


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 ?

C++ Solutions


Solution 1 - C++

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

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

Solution 2 - C++

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

Solution 3 - C++

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

Solution 4 - C++

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

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

Solution 5 - C++

Another way to print wide string:

std::wstring str1 = L"SomeText";
std::wstring strr2(L"OtherText!");

printf("Wide String1- %ls \n", str1.c_str());
wprintf(L"Wide String2- %s \n", str2.c_str());
  • For printf: %s is narrow char string and %ls is wide char string.
  • For wprintf: %hs is narrow char string and %s is wide char string.

Solution 6 - C++

In addition to what is said above, there are octal and hexadecimal character encodings

std::wstring blankHex = L"\x0020";
std::wstring blankOct= L"\040";

String and character literals (C++)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRoee GavirelView Question on Stackoverflow
Solution 1 - C++Bo PerssonView Answer on Stackoverflow
Solution 2 - C++hmjdView Answer on Stackoverflow
Solution 3 - C++ValView Answer on Stackoverflow
Solution 4 - C++Hemant MetaliaView Answer on Stackoverflow
Solution 5 - C++Nikita JainView Answer on Stackoverflow
Solution 6 - C++Sam GinrichView Answer on Stackoverflow