乱码原因
直接先用一段话讲乱码原因,看不懂老老实实就往下看吧
其实我用Sublime或者VSCode等编辑器写代码出现的控制台中文乱码问题是编译器mingw输出的数据使用的是UTF-8编码,而控制台用了GBK编码来解析它。
其实编码只要统一用UTF8或者GBK都行,但用了错误的编码去解析文件就会出错。
问题来源
如果我们写轻量代码(比如写算法题)也用VS之类的IDE,就太不划算了;虽然也有Codeblocks、Dev C++这样的小一点的IDE,但用起来还是可以发现让人很不爽的缺点。
之前尝试用VS Code写C++代码,挺不错的,好看方便。但问题就是难配置,最大的问题是控制台中文乱码,我搞了好久都没搞好,今天终于解决了。
在网上找到一段话是这么讲的:
Windows(中文)默认的字符集是Windows-936(GBK),mingw的内部是GCC,而GCC编译器默认编译的时候是按照UTF-8解析和输出的,当未指定字符集时一律当作UTF-8进行处理,于是造成乱码。
根据上边这段话,我有点灵感,但还是有疑问,见下。
问题分析
我电脑的CMD编码设置的是UTF-8,代码文件的编码也是UTF-8,如果mingw默认按UTF-8处理的话,可以看到这里用的编码全都是UTF-8,那应该不会出现乱码的。
但我们确实看到了乱码啊!?
当我去看我的注册表(见下图),发现代码链接、编译后生成的可执行文件有一个单独的注册表,这似乎说明我们运行的可执行文件并不是我们口中的那个CMD(按Win+R、cmd
打开的那个CMD)。所以@roadwide整理的网上的改CMD编码啊什么的,可能搞错了问题的方向,不过也算一个方法吧,但似乎对我不适用。我之前也是搞错了方向。
如下图所示,我们运行的可执行文件,也就是那个弹出来的控制台,它的编码是GBK。现在我们应该知道乱码的原因了。
整个过程是这样的:
- 我们代码的编码是UTF-8
- 把UTF-8编码的代码交给mingw,它也默认当做UTF-8处理(目前为止这是正确的)
- mingw处理后生成的数据还是UTF-8编码(目前为止还是正确的)
- 把mingw处理后的数据(UTF-8编码)给cmd(目前为止也是正确的)
- cmd按GBK编码处理它(UTF-8),这时出现错误,所以出现乱码
解决方案
我们可以修改mingw的输出,让它在编译时使用GBK编码输出,然后再让CMD去显示。
处理中文乱码只需要设置两个(核心只有一个)编译参数,即在tasks.json
中tasks
中的args
中添加-fexec-charset=GBK
和-finput-charset=UTF-8
,下边tasks.json
中的第14、15行。
这个解决方案中代码文件的编码是UTF-8,控制台编码是GBK,令mingw实现编码转换。
下面的.vscode
配置是我在网上找到的比较新的VS Code配置,可以作为参考,具体不做解释,想了解可以去看文章末的参考网址。
tasks.json
1 | // 用来编译 |
-fexec-charset=GBK
是令mingw按GBK编码生成exe文件。
-finput-charset=UTF-8
是令mingw按UTF-8编码处理。(经测试这个参数可以不设置)
launch.json
1 | { |
参考链接
作者:@臭咸鱼
转载请注明出处:https://chouxianyu.github.io
欢迎讨论和交流!