c - 打印 ASCII 框不起作用

标签 c windows ascii mingw32

我只是想在控制台中打印一个充满 ASCII 框的形状,但输出只是垃圾文本。这是我的代码:

#include <stdio.h>

const char shade_block[] = {
    "▒▒██████▒▒\n\
     ▒████████▒\n\
     ██████████\n\
     ▒████████▒\n\
     ▒▒██████▒▒\n\
    "};

int main()
{
    printf(shade_block);
    return 0;
}

这是输出:

ΓûÆΓûÆΓûêΓûêΓûêΓûêΓûêΓûêΓûÆΓûÆ
         ΓûÆΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûÆ
         ΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûê
         ΓûÆΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûÆ
         ΓûÆΓûÆΓûêΓûêΓûêΓûêΓûêΓûêΓûÆΓûÆ

代码图片(如果未正确显示)。

Picture of the code, if it's not displaying properly.

我正在使用 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/

相关文章:

c - 按位积分去抖动运算符混淆

elasticsearch - 哪种最佳做法是在python3中的混合编码文本中跳过非ascii字符?

python - getch() 返回错误字符

ruby - 使用 `?`(问号)在 Ruby 中获取 ASCII 字符代码失败

比较 int 与 long 和其他

c++ - 调用 D3DX10CreateEffectFromFile() 方法的链接器问题

c - 整数指针和 'incompatible pointer type warning'

MySQL DB 在 Ubuntu 中运行,但不在 Windows 中运行

c# - 创建可以通过在背景区域中的任意位置拖动来移动的非矩形表单

windows - 视觉小尺寸语言