【问题标题】:Print ASCII box not working打印 ASCII 框不工作
【发布时间】:2017-07-25 23:39:16
【问题描述】:

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

#include <stdio.h>

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

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

这是输出:

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

代码图片,如果显示不正确。

我正在使用 MinGW-32 使用 C、CodeLite IDE、Windows 10。提前致谢。

【问题讨论】:

  • 结果取决于控制台使用的代码页。通常控制台使用 OEM 代码页,当您使用 ANSI 代码页时。您需要使用 Unicode 函数和文本才能正确打印
  • 请注意,您不应使用\ 终止来创建长字符串——请注意第二行和后续行中的空格。使用字符串连接:"▒▒██████▒▒\n" "▒████████▒\n" "██████████\n" "▒████████▒\n" "▒▒██████▒▒\n",它也处理前导空格。字符串段之间只有空格(代码中的换行符,我的注释中的空格)。反斜杠换行机制在 C90 之前是必需的,但从那时起就没有了。
  • 告诉您代码在运行 macOS Sierra 的 Mac 上可以正常运行可能不是什么安慰。

标签: c windows ascii mingw32


【解决方案1】:

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

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

【讨论】:

  • 我把shade_block的类型改成了wchar_t,在它前面加了L,然后用了wprintf,现在什么都不打印了。这是我的编译器的问题吗?
  • 没有。看我的回答。暂时忘记 unicode 和 w_char。
  • @xaresys 我使用WriteConsoleW,它确实打印了所有这些字符
  • @PeterJ - 为什么我需要忘记 unicode ? Unicode 是 Windows 原生的,并且 Unicode 可以完美运行
  • @RbMm - 冷静下来,让这家伙有机会完成他的第一个“hello world”应用程序。我知道你知道该怎么做,但这会让他的大脑完全混乱。让他有机会了解字符串、指针等是什么。我希望你明白我的意思
【解决方案2】:

虽然 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;

}

【讨论】:

    【解决方案3】:
    1. 你的文本编辑器如何编码不可打印的字符是未知的,但我猜它是 UTF-something,并且你的表包含一些你认为完全不同的东西

    2. 看看 ascii > 127 怎么打印

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

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

    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 =  
    

    【讨论】:

    • 你读过我写的吗?这就是他在他的桌子上看到两个字符的原因。他的表格与他认为的内容完全不同
    • @Ryan B 评论前阅读。你不知道那里发生了什么。
    • 我进行了字符测试,由于某种原因,所有内容都显示为同一个字符...例如32 / 20 = ╗33 / 21 = ╗34 / 22 = ╗ 一直到255 / ff = ╗跨度>
    • 在我的 printf 中忘记了另一个 i
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2017-04-27
    • 2016-12-25
    • 2013-06-15
    • 2016-12-11
    • 1970-01-01
    • 2021-02-15
    相关资源
    最近更新 更多