使用`std::cout`打印特殊(扩展)ASCII字符时,输出中出现"?"问题

3
我想在控制台中打印扩展 ASCII 字符,我尝试了以下代码: ``` python print(chr(167)) ``` 但它只打印了一个问号。怎么办?
    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 << char(200);它成功地打印出 '╔' 字符。所以我确定控制台支持扩展ASCII字符。

那么,如何正确输出这些cout呢?

编辑:使用std::wcout << L"";并不起作用。

编辑2:程序仅在Windows 7或更高版本上运行。

编辑3:

使用此代码会打印出卡片,

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

但是,我无法打印任何普通的cout字符,它会报错。 (例如错误字符串:std::cout << "Hello!"


在您的帖子中包含使用代码的环境是相关的。 - anastaciu
@anastaciu 编辑2,已添加。仅适用于Windows。 - Ahmet Yusuf Yatkın
2
@AhmetYusufYatkın,当你使用L前缀时,这种情况有点暗示,但最好还是明确指定,所以做得很好。至于你帖子的最后一部分,你需要继续使用wcoutstd::wcout << L"Hello!";或者在你想再次使用cout时重置编码_setmode(_fileno(stdout), _O_TEXT); - anastaciu
@anastaciu非常感谢,当您写这篇文章时,我已经回答了自己的问题。但是您的答案正是我想要的。 - Ahmet Yusuf Yatkın
1
数据点:在我的MacOS电脑上使用UTF-8而没有进行任何特殊设置。我的vim编辑器默认为无BOM的UTF-8编码。我不认为Windows控制台支持UTF-8,但是(根据Ahmet的发现和答案),可以使用wcout来处理UTF-16。可能有一种方法将std :: cout与UTF-8转换为UTF-16并将输出转发到std :: wcout,以提高方便性......但这将是另一天的实验。 - Eljay
1个回答

1

如果您是在Windows上编写代码,可以使用以下命令:source(_setmode Windows source)

所需的库:

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

将cout转换为Unicode:
_setmode(_fileno(stdout), _O_U16TEXT);

*重要提示:在这种情况下,您应该始终使用std :: wcout << L"";。如果您的代码包含其他行中的std :: cout,则解决方案如下:

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


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