打印 ASCII 框不工作

Print ASCII box not working

我只是想在控制台中打印一个充满 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 中工作。提前致谢。

  1. 你的文本编辑器如何编码 unprintable 字符是未知的,但我猜它是 UTF-something,你 table 包含一些你认为完全不同的东西

  2. 看看ascii > 127如何打印

    for(int i = 32; i < 256;i++)
        printf("%3d / %02x = %c\n\r", i, i, i);`
    

然后使用转义序列定义您的 table - 例如

char a[] = "\xf3\xef"

这里有 4 列版本

for (int i = 32; i < 256; i++)
    printf("%3d / %02x = %c%s", i, i, i, ((i >> 2) << 2 == i) ? "\n\r" : "\t");

输出应该是这样的:

 32 / 20 =
 33 / 21 = !     34 / 22 = "     35 / 23 = #     36 / 24 = $
 37 / 25 = %     38 / 26 = &     39 / 27 = '     40 / 28 = (
 41 / 29 = )     42 / 2a = *     43 / 2b = +     44 / 2c = ,
 45 / 2d = -     46 / 2e = .     47 / 2f = /     48 / 30 = 0
 49 / 31 = 1     50 / 32 = 2     51 / 33 = 3     52 / 34 = 4
 53 / 35 = 5     54 / 36 = 6     55 / 37 = 7     56 / 38 = 8
 57 / 39 = 9     58 / 3a = :     59 / 3b = ;     60 / 3c = <
 61 / 3d = =     62 / 3e = >     63 / 3f = ?     64 / 40 = @
 65 / 41 = A     66 / 42 = B     67 / 43 = C     68 / 44 = D
 69 / 45 = E     70 / 46 = F     71 / 47 = G     72 / 48 = H
 73 / 49 = I     74 / 4a = J     75 / 4b = K     76 / 4c = L
 77 / 4d = M     78 / 4e = N     79 / 4f = O     80 / 50 = P
 81 / 51 = Q     82 / 52 = R     83 / 53 = S     84 / 54 = T
 85 / 55 = U     86 / 56 = V     87 / 57 = W     88 / 58 = X
 89 / 59 = Y     90 / 5a = Z     91 / 5b = [     92 / 5c = \
 93 / 5d = ]     94 / 5e = ^     95 / 5f = _     96 / 60 = `
 97 / 61 = a     98 / 62 = b     99 / 63 = c    100 / 64 = d
101 / 65 = e    102 / 66 = f    103 / 67 = g    104 / 68 = h
105 / 69 = i    106 / 6a = j    107 / 6b = k    108 / 6c = l
109 / 6d = m    110 / 6e = n    111 / 6f = o    112 / 70 = p
113 / 71 = q    114 / 72 = r    115 / 73 = s    116 / 74 = t
117 / 75 = u    118 / 76 = v    119 / 77 = w    120 / 78 = x
121 / 79 = y    122 / 7a = z    123 / 7b = {    124 / 7c = |
125 / 7d = }    126 / 7e = ~    127 / 7f =     128 / 80 = Ç
129 / 81 = ü    130 / 82 = é    131 / 83 = â    132 / 84 = ä
133 / 85 = à    134 / 86 = å    135 / 87 = ç    136 / 88 = ê
137 / 89 = ë    138 / 8a = è    139 / 8b = ï    140 / 8c = î
141 / 8d = ì    142 / 8e = Ä    143 / 8f = Å    144 / 90 = É
145 / 91 = æ    146 / 92 = Æ    147 / 93 = ô    148 / 94 = ö
149 / 95 = ò    150 / 96 = û    151 / 97 = ù    152 / 98 = ÿ
153 / 99 = Ö    154 / 9a = Ü    155 / 9b = ø    156 / 9c = £
157 / 9d = Ø    158 / 9e = ×    159 / 9f = ƒ    160 / a0 = á
161 / a1 = í    162 / a2 = ó    163 / a3 = ú    164 / a4 = ñ
165 / a5 = Ñ    166 / a6 = ª    167 / a7 = º    168 / a8 = ¿
169 / a9 = ®    170 / aa = ¬    171 / ab = ½    172 / ac = ¼
173 / ad = ¡    174 / ae = «    175 / af = »    176 / b0 = ░
177 / b1 = ▒    178 / b2 = ▓    179 / b3 = │    180 / b4 = ┤
181 / b5 = Á    182 / b6 = Â    183 / b7 = À    184 / b8 = ©
185 / b9 = ╣    186 / ba = ║    187 / bb = ╗    188 / bc = ╝
189 / bd = ¢    190 / be = ¥    191 / bf = ┐    192 / c0 = └
193 / c1 = ┴    194 / c2 = ┬    195 / c3 = ├    196 / c4 = ─
197 / c5 = ┼    198 / c6 = ã    199 / c7 = Ã    200 / c8 = ╚
201 / c9 = ╔    202 / ca = ╩    203 / cb = ╦    204 / cc = ╠
205 / cd = ═    206 / ce = ╬    207 / cf = ¤    208 / d0 = ð
209 / d1 = Ð    210 / d2 = Ê    211 / d3 = Ë    212 / d4 = È
213 / d5 = ı    214 / d6 = Í    215 / d7 = Î    216 / d8 = Ï
217 / d9 = ┘    218 / da = ┌    219 / db = █    220 / dc = ▄
221 / dd = ¦    222 / de = Ì    223 / df = ▀    224 / e0 = Ó
225 / e1 = ß    226 / e2 = Ô    227 / e3 = Ò    228 / e4 = õ
229 / e5 = Õ    230 / e6 = µ    231 / e7 = þ    232 / e8 = Þ
233 / e9 = Ú    234 / ea = Û    235 / eb = Ù    236 / ec = ý
237 / ed = Ý    238 / ee = ¯    239 / ef = ´    240 / f0 = ­
241 / f1 = ±    242 / f2 = ‗    243 / f3 = ¾    244 / f4 = ¶
245 / f5 = §    246 / f6 = ÷    247 / f7 = ¸    248 / f8 = °
249 / f9 = ¨    250 / fa = ·    251 / fb = ¹    252 / fc = ³
253 / fd = ²    254 / fe = ■    255 / ff =  

windows 控制台仅使用 Unicode(UTF-16 编码)在控制台中显示文本。如果您以 Unicode 将文本传递到控制台,例如通过 WriteConsoleW - 它将按原样显示。如果您使用 ansi 版本 WriteConsoleA - 在以 ansi 打印之前,您的文本最初将通过调用 MultiByteToWideChar and as first parameter CodePage will be used value returned from GetConsoleOutputCP. by default console used OEM code page GetOEMCP. however you use ansi encoding (GetACP). you can call SetConsoleOutputCP 转换为 Unicode。并且您将需要使用特定的硬编码代码页值 - 与您的编译器在编译源字符串 "▒▒██████▒▒" 时使用的完全相同。当您 运行 在同一个 windows 上编译代码时( 并且如果编译器没有给您警告 C4566:无法表示由通用字符名称 '\uxxxx' 表示的字符在当前代码页 (N)) - SetConsoleOutputCP(GetACP()) - 可以使用,但 ANSI 代码页在不同计算机上可能不同 - 所以在另一台计算机上不起作用。

这里的解决方案非常好 - 使用带有 WriteConsoleW 或其他 W 函数的 Unicode L"▒▒██████▒▒" 字符串。如果您在 运行 时间内将字符串作为多字节字符串 - 您需要在打印之前或 调用 SetConsoleOutputCP(cp),其中 cp - 是字符串中使用的代码页,然后使用 A 函数进行输出。 或者(更好)首先自己通过 MultiByteToWideChar(cp, *) 将字符串转换为 Unicode,然后使用 W 函数输出

虽然 RbMm 和 PeterJ 的回答有效,但我使用了 this Whosebug 问题中的提示,并最终想出了如何按原样打印块而无需任何字符转义或 WriteConsoleW:

#include <stdio.h>
#include <wchar.h>              //For wprintf and wide chars
#include <io.h>                 //For _setmode
#define U_16 0x20000            //U-16 text mode, for the text blocks

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

int main()
{
    _setmode(_fileno(stdout), U_16); //set the output mode to U_16
    wprintf(L"%s\n", shade_block);

    return 0;

}