如何初始化和打印 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 <io.h>
#include <fcntl.h>
设置标准输出模式
_setmode(_fileno(stdout), _O_U16TEXT)
结果:
【讨论】:
非常感谢!我需要很长时间才能弄清楚这一点......我无法打印一个我实例化的 wstring,它的长度比我提供的数据的长度更大,因为sizeof(wchar_t) == sizeof(char) * 2
,然后打印任何东西在那之后不是成功。您的回答解决了多字节打印问题,因此我可以确定发生了什么。【参考方案2】:
尝试使用std::wcout<<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 之间进行转换?