大家好!今天我给大家介绍一下“在Windows控遄咿湫幼制台中设置标准输出缓存和标准输入缓存代码页的方法”。通过设置控制台输出缓存的代码页,可以让控制韪汶萦燔台显示指定字符集(比如:UTF-8)的文本内容,尤其是中文字符(通常英文和数字都是默认支持的)。而设置控制台标准输入缓存的代码页,则只能从输入中读取到对应字符集的文本内容(这里需要注意,通过控制台输入的文本总是系统字符集(Windows中一般为ANSI),如果标准输入缓存的字符集与系统字符集不同,通过scanf函数将获取不到输入的中文字符内容)。如果您觉得这篇教程有帮助,请为我投上宝贵的一票(顺便求个“关注”),谢谢!
工具/原料
已安装VisualStudio2017(或以上版本);
已安装VS2017中的帮助文档(ViewHelper);
已掌握“[控制台(4)]查看和设置控制台字体[TZZ]”;
方法/步骤
1、打开VS2017,新建一个名为“ConsoleDemo7”的“Windows控制台应用程序”项目;
2、在打开的“ConsoleDemo7.cpp”文件中,包含“Windows.h”头文竭惮蚕斗件,同时添加暂停控制台退出的霜杼厮贿system函数调用代码。接着,在main函数中,添加获取控制台输出代码页并打印的测试代码。代码编写完毕后,调试运行程序。在弹出的控制台中,可以见到控制台输出代码页为936。在ViewHelper中查询“GetConsoleOutputCP”,在其帮助文档页中可以找到“CodePageIdentifiers”列表,其中有控制台支持的所有代码页;
3、结束控制台程序,返回到main函数中,继续添加“将控制台输出代码页设置为UTF-8(65001)”的测试代码。代码编写完毕后,调试运行程序。在弹出的控制台窗口中,你会发现之前以ANSI输出的中文,按UTF-8显示时都出现字符重复的问题。设置输出字符之后,通过printf输出的字符,其中的中文则变成了乱码;
4、为了完成ANSI多字节亨蚂擤缚字符到UTF-8字符之间的转换,可以通过MultiByteToWideChar函数将ANS朐袁噙岿I字符转成UNICODE宽字符,然后通过WideCharToMultiByte函数将UNICODE宽字符转成UTF-8多字节字符。转换之后的UTF-8多字节字符串,通过printf函数输出时,就会一切正常。之所以这么麻烦,是由于目前我还未发现Windows有提供这一功能的系统API,只能采用二次转换方式实现多字节字符集字符串之间的格式转换;
5、结束控制台程序,返回到“ConsoleDemo7.cpp”文件中。在main函数之上,定义一个“tx_str_mb_convert”的多字节字符串转换函数。在该函数中,主要通过系统WindowsAPI函数MultiByteToWideChar和WideCharToMultiByte实现不同字符集字符串之间的转换;
6、返回到main函数中,继续添加“将输出字符串转换为UTF-8字符串并打印”的测试代码。代码编写完毕后,调试运行程序。在弹出的控制台中,你会发现输出的中文字符仍旧是乱码。这是由于,默认情况下控制台采用的是“点阵字体”,这个字体实际上不支持UTF-8输出中文。要改正此问题,需要将控制台字体修改为支持UTF-8的字体,比如“Consolas”;
7、结束控制台调试,返回到main函数中。在最后打印输出之前,添加“将控制台字体修改为Consolas的代码”。代码编写完毕后,再次调试运行程序。在弹出的控制台窗口,你会发现之前第一次输出和最后一次输出均显示正常了(中间那个是将ANSI字符串按UTF-8字符打印,自然处理错误,出现乱码!);
8、结束控制台程序调试,返回到main函数中。继续添加“获取控制台标准输入代码页”的测试代码。从这里开始使用printf输出的字符串,都必须保证是UTF-8格式,才是保证中文正确输出。代码编写完毕后,调试运行程序。在弹出的控制台窗口中,你会发现默认情况下的输入缓存代码页也是936(ANSI,系统代码页);
9、结束控制台程序调试,返回到main函数中。继续添加“获取输入内容并打印”的测试代码。在新增加的测试代码中,通过scanf获取输入的字符串,然后将获取到ANSI字符串转换为UTF-8并通过printf输出。代码编写完毕后,调试运行程序。在弹出的控制台窗口中,你可以拷贝一个中文文本,然后通过控制台系统菜单“粘贴”到控制台中并回车。随后,你会发现直接用printf输出的字符串全部显示为乱码,而转换后的字符串可以正常显示;
10、结束控制台程序,返回到main函数中。为了测试,你可以在获取输入的上面使用WindowsAPI函数SetConsoleCP将标准输入缓存代码页修改为UTF-8。然后调试运行程序。在弹出的控制台中,重复拷贝中文内容并回车的过程。在随后的3次测试中,你会发现,只要粘贴的文本中存在中文,则scanf函数都只能获得空字符串。不包含中文时,则可以正常获取到输入内容;
11、至此,设置控制台代码页的方法就介绍完毕了。这里需要补充一下,如果你通过程序控制台窗口的属性窗口修改过控制台配置参数。那么每次该程序打开控制台窗口时,都会读取上次设置的参数,并配置控制台的相关属性。如果需要删除此配置,可以打开注册表,搜索你的程序名称,然后手动将对应的注册表目录删除即可。如果您想学习更多实用编程知识,请参考我写的相关教程。Enjoy!