user-0 提问: 请教一下各位大神关于WIN10系统下使用C语言打印ascii码控制字符的问题

回复:
user: user-1
content: 仅供参考：#pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <windows.h> wchar_t a2w[256]={ 0x0020,0x263a,0x263b,0x2665,0x2666,0x2663,0x2660,0x2022, 0x25d8,0x25cb,0x25d9,0x2642,0x2640,0x266a,0x266b,0x263c, 0x25ba,0x25c4,0x2195,0x203c,0x00b6,0x00a7,0x25ac,0x21a8, 0x2191,0x2193,0x2192,0x2190,0x221f,0x2194,0x25b2,0x25bc, 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, 0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f, 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, 0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f, 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, 0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f, 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, 0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f, 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, 0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f, 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, 0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x2302, 0x00c7,0x00fc,0x00e9,0x00e2,0x00e4,0x00e0,0x00e5,0x00e7, 0x00ea,0x00eb,0x00e8,0x00ef,0x00ee,0x00ec,0x00c4,0x00c5, 0x00e9,0x00e6,0x00c6,0x00f4,0x00f6,0x00f2,0x00fb,0x00f9, 0x00ff,0x00d6,0x00dc,0x00a2,0x00a3,0x00a5,0x20a7,0x0192, 0x00e1,0x00ed,0x00f3,0x00fa,0x00f1,0x00d1,0x00aa,0x00ba, 0x00bf,0x2310,0x00ac,0x00bd,0x00bc,0x00a1,0x00ab,0x00bb, 0x2591,0x2592,0x2593,0x2502,0x2524,0x2561,0x2562,0x2556, 0x2555,0x2563,0x2551,0x2557,0x255d,0x255c,0x255b,0x2510, 0x2514,0x2534,0x252c,0x251c,0x2500,0x253c,0x255e,0x255f, 0x255a,0x2554,0x2569,0x2566,0x2560,0x2550,0x256c,0x2567, 0x2568,0x2564,0x2565,0x2559,0x2558,0x2552,0x2553,0x256b, 0x256a,0x2518,0x250c,0x2588,0x2584,0x258c,0x2590,0x2580, 0x03b1,0x00df,0x0393,0x03c0,0x03a3,0x03c3,0x00b5,0x03c4, 0x03a6,0x0398,0x03a9,0x03b4,0x221e,0x03c6,0x03b5,0x2229, 0x2261,0x00b1,0x2265,0x2264,0x2320,0x2321,0x00f7,0x2248, 0x00b0,0x2219,0x00b7,0x221a,0x207f,0x00b2,0x25a0,0x00ff, }; extern "C" HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;     wchar_t ws[256];     unsigned char s[256];     int i;       system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hfont = CreateFont(16,  0, 0, 0, 0, 0, 0, 0, 0           , 0, 0, 0, 0, "Lucida Console");     SelectObject(hdc,hfont);     TextOutW(hdc,10,10,L"你好",2);     for (i=0;i<256;i++) s[i]=i;     for (i=0;i<256;i++) ws[i]=a2w[s[i]];     TextOutW(hdc,10, 40,ws    ,32);     TextOutW(hdc,10, 80,ws+ 32,32);     TextOutW(hdc,10,120,ws+ 64,32);     TextOutW(hdc,10,160,ws+ 96,32);     TextOutW(hdc,10,200,ws+128,32);     TextOutW(hdc,10,240,ws+160,32);     TextOutW(hdc,10,280,ws+192,32);     TextOutW(hdc,10,320,ws+224,32);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     ShowTheCursor();     return 0; }

user: user-2
content: 引用 2 楼 kevin252441638 的回复:[quote=引用 1 楼 user-2 的回复:] 与codepage以及字体有关    user-2 您好，我看了一下WIN7和WIN10的CODEPAGE都是936（GBK）但是win7系统可以正常打印（例如直接printf(“\06”);）WIN10却不可以，我把所有的字体都尝试了一遍。您如果方便的话，能不能麻烦您详细的讲一下，我对这方面没什么知识，希望能够了解一下解决这个问题，不甚感激。[/quote] 控制字符一般来说应该不能显示,在win7上可以显示我也不清楚用了什么字体. 你需要打印出扑克符号的话,可以用unicode,https://en.wikipedia.org/wiki/Playing_cards_in_Unicode 把代码页转到unicode,用system("chcp 1200");是UTF-16LE,然后打印比如黑桃的Unicode值为0x2660,就这样打印printf("%c%c", 0x60, 0x26); 不过我试了下,不知道什么原因,chcp 1200失败,所以改成chcp 65001,也就是UTF-8的代码页,这样需要将unicode转成utf-8 下面代码亲测可用: #include <stdio.h> #include <stdlib.h> void print_u8(unsigned u16) { 	if (u16 < 0x80)  		printf("%c", u16); 	else if (u16 < 0x800)  		printf("%c%c",  			0xc0 | u16 >> 6,  			0x80 | u16 & 0x3f); 	else if (u16 < 0x10000)  		printf("%c%c%c",  			0xe0 | u16 >> 12,  			0x80 | u16 >> 6 & 0x3f,  			0x80 | u16 & 0x3f); 	else 		printf("%c%c%c%c", 			0xf0 | u16 >> 18, 			0x80 | u16 >> 12 & 0x3f, 			0x80 | u16 >> 6 & 0x3f, 			0x80 | u16 & 0x3f); } int main() { 	system("chcp 65001"); 	print_u8(0x2660); 	return 0; }

user: user-0
content: 引用 1 楼 user-2 的回复:与codepage以及字体有关    user-2 您好，我看了一下WIN7和WIN10的CODEPAGE都是936（GBK）但是win7系统可以正常打印（例如直接printf(“\06”);）WIN10却不可以，我把所有的字体都尝试了一遍。您如果方便的话，能不能麻烦您详细的讲一下，我对这方面没什么知识，希望能够了解一下解决这个问题，不甚感激。

user: user-2
content: 0.首先说明我在3楼的代码的测试环境是win7,编译器是mingw,直接在命令行下敲“gcc 源码”编译，生成名为a.exe的程序，然后再敲a回车运行。 1."提示chcp不是命令"，这与环境变量有关，你可以试试用绝对路径，chcp的绝对路径在win7下是c:\windows\system32\chcp.com 2."最开始的时候是没问题的，但是后来突然就不可以了",可能是你改变codepage,你用了utf-8,之后输出中文全得用utf-8 3.既然没问题就不用说了

user: user-2
content: 与codepage以及字体有关

user: user-0
content: 引用 1 楼 user-2 的回复:与codepage以及字体有关 user-2，非常感谢您的回答，我测试了您提供的代码，以下是结果，也供其它遇到类似问题的朋友作参考 在WIN10平台下： 1.使用dev-cpp运行出错，提示‘chcp’不是内部或外部命令，也不是可运行的程序或批处理文件  2.使用code block运行的结果很有意思， 最开始的时候是运行成功的，可以正常输出， 然后我测试了一下直接采用printf("c%c%c%",0xe2,0x99,0xa5);的方式进行输出，最开始的时候是没问题的，用此方式输出中文字符也没问题，但是后来突然就不可以了，我应该没有改变什么设置，只作了几次chcp改codepage的操作在gbk、utf-8、utf-16之间切换。 现在使用codeblock无论怎样调控制台设置都是无法输出该字符 （win10 控制台提供的所有字体都试过了，不行，应该不是这个问题。）  这件事情让我百思不得其解，如果有想明白的大神还请不吝赐教，纠结了好久了。 3.使用VS2015运行可以正常输出，包括采用 user-2大神 所提供的方法或printf("c%c%c%",0xe2,0x99,0xa5);的方法都可以，目前还没有遇到什么问题。  在win7平台下： 采用VMware12搭建win7虚拟机进行测试，可以直接打印 ascii码的控制字符（使用dev-cpp）  在另外一台win7电脑上使用vc6.0测试同样成功打印。  因为本身没有学习过相关方面的知识，在此只能把我的测试结果与大家分享，希望能够有幸与对此有研究的大神们探讨。