如何初始化和打印 std: : wstring?

我有密码:

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

但是现在我的团队想转移到 wstring。 所以我试着:

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

但这给了我一个编译错误:

错误1错误 C2664: : basic _ string < _ Elem,_ Traits,_ Ax > : : basic _ string (const : basic _ string < _ Elem,_ Traits,_ Ax > &)’: 无法转换参数1 从‘ const char [8]’到‘ const std: : basic _ string < _ Elem,_ Traits,_ Ax > & D: ... TestModule1.cpp 281 TestModule1

在网上搜索之后,我发现我应该把它定义为:

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

这编译但打印 "0000000000012342"而不是 "SomeText"

我做错了什么?

104474 次浏览

要显示 wstring,还需要 cout-wcout 的宽版本。

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

使用 std::wcout代替 std::cout

尝试使用 std::wcout<<st它会解决你的问题。

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

这个答案适用于“ C + +/CLI”标记和相关的 Windows C + + 控制台。

如果您在 std: : wstring 中获得了多字节字符,那么还需要做两件事情才能使其正常工作:

  1. 包括标题
    #include <io.h>
    #include <fcntl.h>
  2. 设置标准输出模式
    _setmode(_fileno(stdout), _O_U16TEXT)

结果: Multi-bytes console

另一种打印宽字符串的方法:

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());
  • 对于 打印: % s是窄字符串,% ls是宽字符串。
  • 对于 Wprintf: % hs是窄字符串,% s是宽字符串。

除了上面所说的,还有八进制和十六进制字符编码

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

字符串和字符文字(C + +)