2017-07-25 53 views
-2

我只是试图打印一个充满填充ASCII框的形状到控制台,但输出只是垃圾文本。这里是我的代码:打印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的工作。提前致谢。

+0

结果取决于控制台使用的代码页。当您使用ANSI代码页时,通常的控制台使用OEM代码页。您需要使用Unicode功能和文本以进行正确的打印 – RbMm

+0

请注意,您不应该使用''''''终止来创建长字符串 - 见证第二行和后续行中的空格。使用字符串连接:'“▒▒██████▒\ \ n” “▒████████▒\ n” “██████████\ n” “▒█████████\ n” “▒▒██████▒▒\ n”'也处理主要空白。这些字符串段之间只有空白(代码中的换行符,我的注释中的空白)。在C90之前,反斜线换行机制是必需的,但自此以后就没有了。 –

+0

它可能不是任何安慰告诉你,代码在运行macOS Sierra的Mac上可以正常工作。 –

回答

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; 

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

  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 =   
+0

你读过我写的吗?这就是他在他的桌子上看到两个人物的原因。他的桌子有着完全不同的内容,他认为 –

+0

@ Ryan B在评论前阅读。你不知道那里发生了什么。 –

+0

我进行了角色测试,出于某种原因,所有的东西都显示为相同的字符,比如'32/20 =╗','33/21 =╗','34/22 =╗' '255/ff =╗' – xaresys

0

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

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

+0

我把'shade_block'的类型改成了'wchar_t',在它之前加了L,并且使用了wprintf,现在它什么都不打印。这是我的编译器的问题吗? – xaresys

+0

否请参阅我的回答。现在忘记unicode&w_char。 –

+0

@xaresys我使用'WriteConsoleW',它真的打印所有这些字符集 – RbMm