打印 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 中工作。提前致谢。
你的文本编辑器如何编码 unprintable 字符是未知的,但我猜它是 UTF-something,你 table 包含一些你认为完全不同的东西
看看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;
}
我只是想在控制台中打印一个充满 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 中工作。提前致谢。
你的文本编辑器如何编码 unprintable 字符是未知的,但我猜它是 UTF-something,你 table 包含一些你认为完全不同的东西
看看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;
}