打印ASCII框不起作用

时间:2017-07-25 23:39:16

标签: 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,使用MinGW-32的WIndows 10工作。提前谢谢。

3 个答案:

答案 0 :(得分:0)

  1. 你的文本编辑器如何编码不可打印的字符是未知的,但我想这是UTF的东西,而你的表包含了你认为完全不同的东西

  2. 了解如何做ascii&gt; 127打印

    for(int i = 32; i < 256;i++)
        printf("%3d / %02x = %c\n\r", i, i, i);`
    
  3. 然后使用转义序列定义表格 - 例如

    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 =  
    

答案 1 :(得分:0)

Windows控制台仅使用Unicode(UTF-16编码)在控制台中显示文本。如果你用Unicode将文本传递给控制台,比如通过WriteConsoleW - 它将按原样显示。如果您使用ansi版本WriteConsoleA - 您的文本最初将通过调用MultiByteToWideChar转换为Unicode,并且将使用从GetConsoleOutputCP返回的第一个参数CodePage。默认情况下,控制台使用OEM代码页GetOEMCP。但是你使用ansi编码(GetACP)。您可以在ansi中打印之前致电SetConsoleOutputCP。并且您将需要使用特定的,硬编码的代码页值 - 完全相同,编译器在编译源字符串"▒▒██████▒▒"时使用这些值。当你在相同的窗口上运行时,你编译代码(,如果编译器没有给你警告C4566:由通用字符名称代表的字符&#39; \ uxxxx&#39;无法在当前代码页中表示(N)) - SetConsoleOutputCP(GetACP()) - 将被使用,但ANSI代码页在不同的计算机上可能不同 - 所以不能在另一台计算机上工作。

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

答案 2 :(得分:0)

虽然RbMm和PeterJ的答案有效,但我使用了来自this StackOVerflow问题的提示,并最终找到了如何在没有任何字符转义或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;

}