我只是想在控制台中打印一个充满 ASCII 框的形状,但输出只是垃圾文本。这是我的代码:
#include <stdio.h>
const char shade_block[] = {
"▒▒██████▒▒\n\
▒████████▒\n\
██████████\n\
▒████████▒\n\
▒▒██████▒▒\n\
"};
int main()
{
printf(shade_block);
return 0;
}
这是输出:
ΓûÆΓûÆΓûêΓûêΓûêΓûêΓûêΓûêΓûÆΓûÆ
ΓûÆΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûÆ
ΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûê
ΓûÆΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûÆ
ΓûÆΓûÆΓûêΓûêΓûêΓûêΓûêΓûêΓûÆΓûÆ
代码图片(如果未正确显示)。
我正在使用 C、CodeLite IDE、WIndows 10 和 MinGW-32 进行工作。提前致谢。
最佳答案
Windows 控制台仅使用 Unicode(UTF-16 编码)在控制台中显示文本。如果您以 Unicode 将文本传递到控制台,例如通过 WriteConsoleW
- 它将按原样显示。如果您使用 ansi 版本 WriteConsoleA
- 您的文本最初将通过调用 MultiByteToWideChar
转换为 Unicode,并且作为第一个参数 CodePage
将使用从 GetConsoleOutputCP
返回的值。默认情况下,控制台使用 OEM 代码页 GetOEMCP
。但是您使用 ansi 编码 ( GetACP
)。你可以在ansi中打印之前调用SetConsoleOutputCP
。并且您将需要使用特定的硬编码代码页值 - 与编译器在编译源字符串 "▒▒██████▒▒"
时使用的值完全相同。当您在编译代码的同一窗口上运行时(并且如果编译器没有向您发出警告 C4566:由通用字符名称 '\uxxxx' 表示的字符无法在当前代码页中表示(N)) - SetConsoleOutputCP(GetACP())
- 将起作用,但 ANSI 代码页在不同计算机上可能不同 - 因此在另一台计算机上不起作用。
这里有很好的解决方案 - 将 Unicode L"▒▒██████▒▒"
字符串与 WriteConsoleW
或另一个 W
一起使用功能。如果您在运行时将字符串作为多字节字符串 - 您需要在打印它之前或者
调用 SetConsoleOutputCP(cp) ,其中 cp - 是字符串中使用的代码页,然后使用 A 函数进行输出。
或者(更好)首先通过 MultiByteToWideChar(cp, *) 将字符串转换为 Unicode,然后使用 W 函数进行输出
关于c - 打印 ASCII 框不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45315127/