【问题标题】:Getting a '?' in the Output when printing special (Extended) ASCII characters using `std::cout`得到一个'?在使用 `std::cout` 打印特殊(扩展)ASCII 字符时在输出中
【发布时间】:2020-09-28 07:58:12
【问题描述】:

我想在控制台打印扩展的 ascii 字符,我试过这个:

    std::cout << "╔══════════╦════════════════════════════════════════════════════════╗\n";
    std::cout << "║  ID:678  ║  Name: ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓        ║\n";
    std::cout << "║          ║  Surname: ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓     ║\n";
    std::cout << "║          ║  Gender: ▓▓▓▓▓▓                                        ║\n";
    std::cout << "║          ║  Age: ▓▓▓                                              ║\n";
    std::cout << "║          ║  Tel: ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                  ║\n";
    std::cout << "║          ║  Adress: ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓     ║\n";
    std::cout << "║          ║  ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓     ║\n";
    std::cout << "║ ID Print ║  Hobbies: ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓     ║\n";
    std::cout << "║          ║  ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓     ║\n";
    std::cout << "║  ░░░░░░  ║  Additional İnformations: ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓     ║\n";
    std::cout << "║  ▒▓▓▓▓▒  ║  ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓     ║\n";
    std::cout << "║  ▓▓▓▓▓▓  ║  ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓     ║\n";
    std::cout << "╚══════════╩════════════════════════════════════════════════════════╝\n";

但是输出是这样的:

?????????????????????????????????????????????????????????????????????
?  ID:678  ?  Name: ????????????????????????????????????????        ?
?          ?  Surname: ????????????????????????????????????????     ?
?          ?  Gender: ??????                                        ?
?          ?  Age: ???                                              ?
?          ?  Tel: ???????????????????????????????                  ?
?          ?  Adress: ?????????????????????????????????????????     ?
?          ?  ?????????????????????????????????????????????????     ?
? ID Print ?  Hobbies: ????????????????????????????????????????     ?
?          ?  ?????????????????????????????????????????????????     ?
?  ??????  ?  Additional ¦nformations: ????????????????????????     ?
?  ??????  ?  ?????????????????????????????????????????????????     ?
?  ??????  ?  ?????????????????????????????????????????????????     ?
?????????????????????????????????????????????????????????????????????

但是当我尝试这个时:std::cout &lt;&lt; char(200); 它成功打印 '╔' 字符。所以我确定控制台支持扩展 ascii 字符。

所以;如何正确输出这些 cout?

编辑:使用std::wcout &lt;&lt; L""; 不起作用。

Edit2:程序只能在 Windows 7 或更高版本中运行。

编辑3:

使用此代码打印卡片,

#include <fcntl.h>
#include <io.h>
_setmode(_fileno(stdout), _O_U16TEXT);

但是,我不能打印任何正常的 cout 字符,它给出了错误。 (示例错误字符串:std::cout &lt;&lt; "Hello!"

【问题讨论】:

  • 在您的帖子中包含您使用代码的环境是相关的。
  • @anastaciu Edit2,已添加。只是窗户。
  • @AhmetYusufYatkın,当你使用L前缀时,这是一种暗示,但最好指定它,做得很好,至于你帖子的最后一部分,你需要继续使用@987654330 @、std::wcout &lt;&lt; L"Hello!"; 或在您想再次使用cout 时重置编码_setmode(_fileno(stdout), _O_TEXT);
  • 数据点:在我的机器 (macOS) 上工作,使用 UTF-8,没有做任何特别的事情。 (我的 vim 编辑器默认为没有 BOM 的 UFT-8。)我认为 Windows 控制台不能与 UTF-8 一起使用,但(根据 Ahmet 的调查结果和回答)能够与 UTF-16 一起使用使用 wcout。为了方便起见,可能有一种方法可以检测 std::cout 以将 UTF-8 转换为 UTF-16 并将输出转发到 std::wcout……但这将是另一天的实验。

标签: c++ std


【解决方案1】:

在windows上写的朋友可以申请这个:source(_setmode Windows source)

需要的库:

#include <fcntl.h>
#include <io.h>

将 cout 转换为 Unicode:

_setmode(_fileno(stdout), _O_U16TEXT);

*重要提示:在这种风格中,你总是应该使用 std::wcout

当您不需要打印特殊字符时,使用_setmode(_fileno(stdout), _O_TEXT); 将标准输出设置回默认文本样式。

【讨论】:

    猜你喜欢
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多