如何在 Windows 10 中使用 C++ 输出低 ASCII?

How to output low ASCII using C++ in Windows 10?

提问人:Gabriel Minosso 提问时间:11/23/2019 最后编辑:genpfaultGabriel Minosso 更新时间:10/25/2022 访问量:267

问:

我正在尝试在 Windows 10 上的 C++ 中为一个简单的贪吃蛇游戏输出方向箭头。但是,使用此表作为参考:

ASCII 参考

我得到的只是控制台中的这个小问号:

小小的问号

我想输出符号 16、17、30 和 31。我不是程序员,所以这可能是一些基本错误,但有些符号确实有效,而其他符号则导致上面的符号。

一个小例子:

void showSnake() {
    char snakeHead;
    snakeHead = 31;
    cout << snakeHead; //THIS SHOWS THE TINY QUESTION MARK
    snakeHead = 62;
    cout << snakeHead; //THIS SHOWS THE ">" SYMBOL
}
C++ Windows ASCII IOstream

评论

2赞 tadman 11/23/2019
如果可以,请使用 Unicode 字符。尽管一般假设相反,但这不是 ASCII,那是 DOS ANSI
1赞 Biffen 11/23/2019
我不知道你从哪里得到这个参考,但它不是 ASCII
0赞 Hans Passant 11/23/2019
按 Alt+空格键>“字体”选项卡>“属性”。您需要选择一种旧的光栅字体。
0赞 Eljay 11/23/2019
这是 ASCII 的一种变体,称为非 ASCII(或 OEM 437)。
1赞 n. m. could be an AI 11/23/2019
ASCII 中没有箭头。你所看到的“参考”是一个谎言。

答:

1赞 SpectreVert 11/23/2019 #1

你应该使用Unicode,你会有更多的字符选择。

https://en.wikipedia.org/wiki/List_of_Unicode_characters 上,我发现了这个符号“▶”,它看起来与你想使用的相似。

它的 unicode 值意味着您可以创建值为 C++ 的字符。U+25BA'\u25BA'

但是,在实践中,该值将超出类型的范围,因此您必须使用宽字符 () 才能完成工作。charwchar

根据这个答案,您还应该使用 C 运行时库中的函数(请参阅此处)在 stdout 中切换对 Unicode 字符的支持。_setmode

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

int main() {
     _setmode(_fileno(stdout), _O_U16TEXT);
     std::wcout << L'\u25BA';
}

评论

1赞 n. m. could be an AI 11/23/2019
“你应该使用Unicode”。让我们先让Microsoft使用Unicode,好吗?或者 C++。在 C++ 中处理 Unicode 是专家的任务。
1赞 Deduplicator 11/23/2019
@n.'代词'm.这取决于一个人想走多远。在这种情况下,一点也不远。
0赞 Gabriel Minosso 11/23/2019
谢谢,但我在我的可视化工作室中尝试过,但什么也没显示。我注意到您错误地将“u”放在“\”前面,即使将其更改为正确的顺序,我的控制台中也没有显示任何内容。尝试使用和不使用“setlocale”行。有什么想法吗?
0赞 Eryk Sun 11/23/2019
对于带有 VC++ 的 Windows,如果 stdout 是控制台文件(例如 成功),那么我们应该通过 将低 I/O C 文件描述符模式切换到 UTF-16。这样可以避免 mojibake 编码到控制台的输出代码页,这通常是 OEM(例如美国代码页 437)。GetConsoleMode(_get_osfhandle(_fileno(stdout)), &mode)_setmode(_fileno(stdout), _O_U16TEXT)
0赞 Eryk Sun 11/23/2019
在 Windows 8 及更高版本中,也可以通过 将控制台输出代码页更改为 UTF-8 (65001) 并使用 UTF-8 字节字符串而不是宽字符字符串,但对于旧版本的 Windows 来说,这完全是一团糟。在所有版本(包括 Windows 10)中,将输入代码页设置为 UTF-8 via 仍然被破坏(限制为 7 位 ASCII)。SetConsoleOutputCP(CP_UTF8)SetConsoleCP