关于乱码,没遇到皆大欢喜,遇到了头痛不已。在Visual Studio中程序遇到乱码,需要明确三个概念,那么问题就好解决了。

三个字符集概念

源码字符集

MSVC中/source-charset

源代码文本文件的字符集,NodePad++、记事本、VS Code这样类似的文本编辑器,可以打开源文件看一下你的字符集(文件编码)。

源代码文本文件是以二进制的形式存在硬盘里的,无论中文英文都一样,当你输入一个汉字后保存关闭,这个汉字就会按照你指定的字符集转换成二进制编码保存下去的,当你在以这个格式打开文件时候,就再按照你指定的字符集把二进制转回来。如果两次使用不同的字符集,也就会出现乱码了。

执行字符集

MSVC中 /execution-charset

在C++里 const char* str = "我";执行字符集决定了这行代码在编译器进行编译的时候,str存储的字节到底是什么,你可能会说源码字符集不是已经决定了这个”我”的二进制表示了么?没错,但是这个执行字符集就是让你在这里对它再解释一次。比如我源码字符集可能是UTF8的,但是我可以通过执行字符集来让最终str存储的是GBK的字节编码。

解析字符集

最终要还原显示这些二进制字节编码的时候,就需要用到它。比如通过printf()把前面的str显示到控制台时,这个printf()就会按照解析字符集来解析这些字节编码,找到指定字符显示出来。

Visual Studio中的字符集分析

默认情况下,Visual Studio 会检测字节顺序标记,以确定源文件是否采用编码的 Unicode 格式,例如 UTF-16 或 UTF-8。 如果未找到字节顺序标记,则假定源文件在当前代码页中编码,除非使用 /source-charset/utf-8 选项指定字符集名称或代码页。 Visual Studio 允许将 C++ 源代码保存在任意几个字符编码中。

代码页是一个字符集,可以包括数字、标点符号和其他标志符号。 不同的语言和区域设置可能使用不同的代码页。 例如,ANSI 代码页 1252 适用于英语和大多数欧洲语言;而 OEM 代码页 932 则适用于日本汉字。

上述为MIcrosoft的官方论述,有点绕。简而言之,对于执行字符集,Visual Studio默认根据系统的Locale来决定执行字符集,一般大家都是Windows中文系统,Locale是中国,那么就是GBK编码。对于解析字符集,如果没有手动更改的话,Visual Studio的标准输入输出(printf,cout)到命令行也是根据系统Locael决定的,也就是GBK。

如何使用UTF-8

为了全过程都能正常显示,不乱码,那应该三个阶段都需要设置为UTF-8。

源字符集和执行字符集设置为 UTF-8

可以使用 /utf-8 选项将源字符集和执行字符集指定为使用 UTF-8 编码的字符集。 它等效于在命令行上指定 /source-charset:utf-8 /execution-charset:utf-8

在 Visual Studio 开发环境中设置此编译器选项

  1. 打开项目“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
  2. 选择“配置属性”>“C/C++”>“命令行”属性页。
  3. 在“附加选项”中,添加 /utf-8 选项以指定首选编码。
  4. 选择“确定”以保存更改 。

解析字符集设置为 UTF-8

SetConsoleCP 函数设置与调用进程关联的控制台所使用的输入代码页。 控制台使用其输入代码页将键盘输入转换为相应的字符值。

BOOL WINAPI SetConsoleCP(_In_ UINT wCodePageID
);

在mian()函数中加入以下代码

std::cout << "GetConsloeCP" << GetConsoleCP() << std::endl;
SetConsoleOutputCP(65001);//65001代表UTF-8,参见代码页标识符
std::cout << "GetConsloeCP" << GetConsoleOutputCP() << std::endl;qDebug() << QTextCodec::codecForLocale()->name();
QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf-8"));//Qt输出
qDebug() << QTextCodec::codecForLocale()->name();

另外,C++11可以指定字符串字面量的执行字符集了,const char* str = u8"我";在字符串前面加u8就可以了。

/source-charset(设置源字符集) | Microsoft Docs

/utf-8(将源字符集和执行字符集设置为 UTF-8) | Microsoft Docs

SetConsoleCP 函数 - Windows Console | Microsoft Docs

代码页 | Microsoft Docs

代码页标识符 - Win32 apps | Microsoft Docs

MSVC中C++ UTF8中文编码处理探究

探究Visual Studio中的乱码问题相关推荐

  1. 探究Visual Studio项目的当前目录

    本文的缘起是我要用 OpenCV 库中的函数读取本地的图像,但是在文件路径名上碰到了一点挫折.本文探究 Visual Studio 2019 项目的当前目录.牵涉到计算机科学与技术的三个概念:当前目录 ...

  2. Xamarin XAML语言教程Visual Studio中实现XAML预览

    2019独角兽企业重金招聘Python工程师标准>>> Xamarin XAML语言教程Visual Studio中实现XAML预览 每次通过编译运行的方式查看XAML文件效果,需要 ...

  3. 《Ext JS权威指南》节选:在Visual Studio中实现Ext JS智能提示

    Visual Studio(下面简称VS) 2008和2010都有从JS库文件获取智能提示的功能,不过直接使用ExtJS的库文件的话,虽然也有提示,但是不全,应该说是大部分没有,主要原因是VS脚本提示 ...

  4. 如何:在 Visual Studio 中添加或移除引用(转载)

    http://msdn2.microsoft.com/zh-cn/library/wkze6zky(VS.80).aspx Visual Studio 如何:在 Visual Studio 中添加或移 ...

  5. Visual Studio中没有为此解决方案配置选中要生成的项目

    Visual Studio中没有为此解决方案配置选中要生成的项目 参考文章: (1)Visual Studio中没有为此解决方案配置选中要生成的项目 (2)https://www.cnblogs.co ...

  6. 在Visual Studio中使用命令行参数进行调试

    我正在Visual Studio中开发一个C ++命令行应用程序,需要使用命令行参数进行调试. 目前我只使用我需要的参数(如此program.exe -file.txt )运行生成的EXE文件,但这样 ...

  7. 如何在Visual Studio中“添加现有项”整个目录结构?

    我有一个独立于任何C#项目的独立文件集,它们位于复杂的嵌套目录结构中. 我想以这种格式将它们添加到我正在处理的ASP.NET Web应用程序中的不同目录中; 同时保留相同的结构. 所以,我将文件夹复制 ...

  8. 在Visual Studio中使用Git [关闭]

    作为一个长期的Visual SourceSafe用户(和仇恨)我正在讨论与同事转换到SVN ; 他建议改用Git . 显然,它可以在没有中央服务器的情况下用作点对点(我们是一个3开发团队). 我无法找 ...

  9. 如何在Visual Studio中直接使用示例代码浏览器搜索下载和管理代码示例

    今天微软一站式示例代码库团队发布了示例代码浏览器的Visual Studio 扩展.有了它,开发人员就可以在Visual Studio 2010里直接通过Alt+F1快捷键搜索示例代码,并方便地对示例 ...

最新文章

  1. 基于SSL的mysql(MariaDB)主从复制
  2. img下面的png图片 vs 读不出来_VUX中XImg组件加载图片不正确,BusPlugin不好使,求解...
  3. 牛客题霸 NC11 将升序数组转化为平衡二叉搜索树
  4. SpringIOC的依耐注入DI---set注入---constructor有参构造注入---了解P命名空间---了解SpEL
  5. linux下格式化U盘
  6. cmd命令行启动、停止IIS,打开iis net start w3svc
  7. 差分隐私 python_[宜配屋]听图阁
  8. Qt Windows 下软件 release 发布
  9. 【MTSP】基于matlab蚁群和粒子群算法求解多旅行商问题【含Matlab code 1156期】
  10. 浅谈如何带领好一个团队
  11. 磁盘管理之动态磁盘和静态磁盘的区别
  12. 当Analyzer 2007 遇上.Net 3.0时,可能会秀才爱上兵
  13. 联盟链步入黄金时代 |链捕手
  14. Douyin-Bot 项目优化-改进,优化效率,本地cv2识别过滤
  15. RocketMQ下载安装及基本使用
  16. 《灵飞经》3·印神无双 第十三章 剑奕星斗 3
  17. [附源码]Java计算机毕业设计SSM大学生项目众筹系统
  18. 使用mkiso向服务器传文件,Linux mkisofs 创建光盘镜像文件(Linux指令学习笔记)
  19. 逻辑回归与线性回归算法梳理
  20. 写好标题 N倍提升你的IP

热门文章

  1. 玫琳凯生产并捐赠洗手液以抗击COVID-19大流行
  2. 什么浏览器好用啊(浏览器排行榜前十名)
  3. Windows下批量下载rpm安装文件
  4. python信息熵的计算
  5. [RPM打包学习-SPEC文件]——%patch相关问题
  6. linux mrtg 安装,Linux系统mrtg详细安装、设置说明
  7. 利用机器学习之决策树进行预测分析
  8. 金沙滩51单片机LED 流水灯程序
  9. xgboost简单介绍_XGBOOST模型介绍
  10. 2022美赛E题思路记录