1. 使用Visual Studio 控制台输出中文乱码
(1)解决办法
- 分情况讨论,比如在读取文件时,文件的默认编码格式是UTF-8,那么就使用SetConsoleOutputCP函数将控制台输出的编码格式也改为UTF-8,则问题解决。
- 比如编程时程序中有中文,则需要更改VS的编码格式与控制台的编码格式一致,这里以UTF-8为例,编程时使用预编译命令:**#pragma execution_character_set(“utf-8”),设置程序编码格式为:UTF-8,另外使用SetConsoleOutputCP函数设置控制台编码格式为:UTF-8**。
- 在这里并不推荐使用插件:Force UTF-8( NO BOM) 如下图所示,因为该插件将文件保存为UTF-8的类型,而前面提到的预编译命令、设置输出窗口编码的函数都是设置为:UTF-8 BOM 格式,故使用插件还是可能会出现乱码
(2)SetConsoleOutputCP
该函数是Windows操作系统中的一个API函数,用于设置控制台输出的代码页(code page)。代码页定义了字符集的映射,它告诉操作系统如何解释和显示文本中的字符。
UINT SetConsoleOutputCP(
UINT wCodePageID
);
wCodePageID:指定要设置的代码页的标识符。默认情况下,Windows控制台使用本地系统的ANSI代码页,这可能导致在输出中无法正确显示非英文字符。
需要注意的是,使用SetConsoleOutputCP可能会影响整个应用程序的输出,因此在使用时请考虑上下文和其他可能的影响。
(3)常用的wCodePageID
- UTF-8(CP_UTF8) (1) 标识符:‘CP_UTF8’或‘65001’ (2) Unicode字符编码,可表示几乎所有的字符,是一种变长字符编码。
- ANSI(CP_ACP) (1) 标识符:‘CP_ACP’或‘0’ (2) 系统默认的ANSI(单字节字符集)代码页,通常是Latin-1或Windows-1252.
- 简体中文 GB2312(CP_ACP) (1) 标识符:936 (2) 用于简体中文的GB2312字符集。
(4)使用场景
这里以在Windows中读取文本文件为例进行演示。
#include<iostream>#include<fstream>#include<string>#include<windows.h>#pragmaexecution_character_set("utf-8");usingnamespace std;intmain(){SetConsoleOutputCP(65001);
ifstream ifs;
ifs.open("test01.txt", ios::in);if(ifs.is_open()){
string line;while(std::getline(ifs, line)){
cout << line << endl;}
ifs.close();}else{
cout <<"文件打开失败"<< endl;}return0;}
输出结果如下图所示:
2. Visual Studio中调试窗口内中文乱码问题
(1)问题描述
上一节解决的是控制台输出中文乱码,那么在调试程序时,当程序中包含中文,或者编程读取包含中文的文件时,大家会发现,在调试窗口中显示的中文仍然是乱码的,如调试下面的程序(记得打上断点)。
#include<iostream>intmain(){SetConsoleOutputCP(65001);constchar* ptrStr ="中国 hello";
std::cout << ptrStr << endl;return0;}
在调试窗口中查看指针变量ptrStr的值,如下所示。
(2)解决方法
- 将变量ptrStr添加到监视窗口;
- 然后鼠标双击变量ptrStr;
- 修改其值,在ptrStr后面加上:“,s8”;
- 中文显示正常。
(3)使用场景
版权归原作者 自由的7 所有, 如有侵权,请联系我们删除。