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>
#pragma execution_character_set("utf-8");
using namespace std;
int main()
{
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;
}
return 0;
}
输出结果如下图所示:
2. Visual Studio中调试窗口内中文乱码问题
(1)问题描述
上一节解决的是控制台输出中文乱码,那么在调试程序时,当程序中包含中文,或者编程读取包含中文的文件时,大家会发现,在调试窗口中显示的中文仍然是乱码的,如调试下面的程序(记得打上断点)。
#include <iostream>
int main()
{
SetConsoleOutputCP(65001);
const char * ptrStr = "中国 hello";
std::cout << ptrStr << endl;
return 0;
}
在调试窗口中查看指针变量ptrStr的值,如下所示。
(2)解决方法
- 将变量ptrStr添加到监视窗口;
- 然后鼠标双击变量ptrStr;
- 修改其值,在ptrStr后面加上:“,s8”;
- 中文显示正常。