【发布时间】: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 << char(200); 它成功打印 '╔' 字符。所以我确定控制台支持扩展 ascii 字符。
所以;如何正确输出这些 cout?
编辑:使用std::wcout << L""; 不起作用。
Edit2:程序只能在 Windows 7 或更高版本中运行。
编辑3:
使用此代码打印卡片,
#include <fcntl.h>
#include <io.h>
_setmode(_fileno(stdout), _O_U16TEXT);
但是,我不能打印任何正常的 cout 字符,它给出了错误。
(示例错误字符串:std::cout << "Hello!")
【问题讨论】:
-
在您的帖子中包含您使用代码的环境是相关的。
-
@anastaciu Edit2,已添加。只是窗户。
-
@AhmetYusufYatkın,当你使用
L前缀时,这是一种暗示,但最好指定它,做得很好,至于你帖子的最后一部分,你需要继续使用@987654330 @、std::wcout << 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……但这将是另一天的实验。