如何初始化并打印一个std::wstring?

83

我有这段代码:

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

之前我使用的是string,这个很好用。但现在我的团队想要转移到wstring上。 所以我尝试了:

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

但是这会导致编译错误:

错误 1 错误 C2664: “std::basic_string<_Elem,_Traits,_Ax>::basic_string(const std::basic_string<_Elem,_Traits,_Ax>&)”:无法将参数 1 从“const char [8]”转换为“const std::basic_string<_Elem,_Traits,_Ax>&” D:...\TestModule1.cpp 28 1 TestModule1

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

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

这段代码可以编译通过,但输出的结果是"0000000000012342"而不是"SomeText"

我做错了什么?


考虑使用 ICU Unicode 库 - [链接] (http://icu-project.org/apiref/icu4c/index.html)。它支持 Unicode 并具有许多有用的功能,特别是如果您想操作这些字符串。 - WeaselFox
@Weasel:为什么你需要一个单独的库来处理Unicode字符串? - Cody Gray
根据我的经验,最好使用单独的库来处理宽字符字符串(搜索、替换等)或其他多字节字符串。 - WeaselFox
谢谢,但我只需要使用wcout而不是cout (-: - Roee Gavirel
6个回答

147
为了显示 wstring,你还需要一个宽字符版的 cout - wcout。
std::wstring st = L"SomeText";
...
std::wcout << st; 

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

14

这个回答适用于"C++/CLI"标签以及相关的Windows C++控制台。

如果你在std::wstring中有多字节字符,需要做两件事来使其正常工作:

  1. 包含头文件
    #include <io.h>
    #include <fcntl.h>
  2. 设置stdout模式
    _setmode(_fileno(stdout), _O_U16TEXT)

结果: 多字节控制台


非常感谢!要是没有您的帮助,我可能需要很长时间才能解决这个问题... 我在打印一个wstring时遇到了麻烦,因为我实例化了一个比我提供的数据更长的字符串,这是由于sizeof(wchar_t) == sizeof(char) * 2,然后在打印超出长度的内容时就失败了。您的答案解决了多字节打印问题,让我能够确定问题所在。 - Andrew

8

尝试使用 std::wcout<<st,这将解决您的问题。

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

3

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

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());
  • printf函数中:%s表示窄字符字符串,%ls表示宽字符字符串。
  • wprintf函数中:%hs表示窄字符字符串,%s表示宽字符字符串。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接