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

Posted

技术标签:

【中文标题】如何初始化和打印 std::wstring?【英文标题】:How to initialize and print a std::wstring? 【发布时间】:2012-02-05 23:11:39 【问题描述】:

我有代码:

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

而且效果很好。但现在我的团队想搬到wstring。 所以我尝试了:

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

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

错误 1 ​​错误 C2664: 'std::basic_string<_elem>::basic_string(const std::basic_string<_elem> &)' : 无法转换参数 1 从 'const char [8]' 到 'const std::basic_string<_elem> &' D:...\TestModule1.cpp 28 1 TestModule1

在网上搜索后,我读到我应该将其定义为:

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

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

我做错了什么?

【问题讨论】:

考虑使用 ICU unicode 库 - link。它支持 unicode 并具有许多有用的功能。特别是如果你想操纵这些字符串。 @Weasel:为什么需要一个单独的库来处理 Unicode 字符串? 根据我的经验,使用单独的库来操作 wchar 字符串(搜索、替换等)或其他多字节字符串要好得多。 谢谢,但我只需要使用 wcout 而不是 cout (-: 【参考方案1】:

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

如果 std::wstring 中有多字节字符,还需要做两件事才能使其工作:

    包括标题 #include &lt;io.h&gt; #include &lt;fcntl.h&gt; 设置标准输出模式 _setmode(_fileno(stdout), _O_U16TEXT)

结果:

【讨论】:

非常感谢!我需要很长时间才能弄清楚这一点......我无法打印一个我实例化的 wstring,它的长度比我提供的数据的长度更大,因为sizeof(wchar_t) == sizeof(char) * 2,然后打印任何东西在那之后不是成功。您的回答解决了多字节打印问题,因此我可以确定发生了什么。【参考方案2】:

尝试使用std::wcout&lt;&lt;st 它将解决您的问题。

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于如何初始化和打印 std::wstring?的主要内容,如果未能解决你的问题,请参考以下文章

如何将CString和:: std :: string :: std :: wstring互相转换?

如何将 UTF-8 std::string 转换为 UTF-16 std::wstring?

如何使用 wstring_convert 在 utf16 和 utf32 之间进行转换?

如何比较 std::string 和 char*?

如何使用正则表达式删除 std::wstring 中特定短语的所有实例?

如何将 std::wstring 转换为 const TCHAR*?