【问题标题】:How to initialize and print a std::wstring?如何初始化和打印 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 (-:

标签: c++ c++-cli wstring


【解决方案1】:

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

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

  1. 包括标题
    #include &lt;io.h&gt;
    #include &lt;fcntl.h&gt;
  2. 设置标准输出模式
    _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; 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-21
        • 2020-10-14
        • 1970-01-01
        • 2016-08-18
        • 2020-04-17
        • 1970-01-01
        • 2010-11-16
        • 2020-11-05
        相关资源
        最近更新 更多