前言
其实网上关于解决这个问题的博客已经有很多了,但是我尝试了很多方法之后都或多或少有不满意的地方,终于自己也摸索出了一套自我感觉相对完美的解决方案,因此发出来供后人参考。
正文
经过查阅资料和自己摸索尝试后,我总结了下解决用VS写的代码中的中文提交后会乱码的方法。 这个问题的原因在于评测环境和VS的编码不一致,VS默认是以GBK编码代码文件,而评测环境是UTF-8编码,因此本地写好的代码交上去后会在评测机中乱码,所以解决方法就是把VS的编码改为UTF8。 网上的操作大概有这么几种:
- 在文件-高级保存选项中改编码为UTF-8。这个方法的缺点是只能一个一个文件改,而且新建的文件依然默认是GBK编码,因此并不方便。并且在VS2019中,高级保存选项的入口被藏的很深,还需要想办法在视图栏中调出来,因此不推荐。
- 安装一个名为Force UTF-8(No BOM)的插件(UTF8有BOM和No BOM两种,为了更好的兼容性,我建议使用No BOM的),这样新建的文件在保存时都会转换成UTF8编码保存。这个插件很小,只有9kB,因此我建议使用此方法。
至此,问题的第一阶段解决了,从而确保了我们在本地写的代码在其他平台上运行不会乱码。但是另一个问题出现了,那就是VS控制台里输出中文的时候会乱码,这个虽然不影响在其他平台上的输出结果,但是对于我们本地调试来说还是或多或少有些不方便。
这个问题同样是编码不一致引起的,VS控制台的默认编码也是GBK,所以识别UTF8编码的中文就会乱码,因此我们需要改VS控制台的编码。
网上的教程主要是这些解决方法:
- 通过改注册表来改cmd powershell的默认编码,但是我在自己的电脑上尝试的过程中遇到的问题有:找不到cmd的注册表项;改了powershell的默认编码后,打开VS控制台发现依然是GBK编码。
- 在时钟-区域中开启全局Unicode编码,但是这个方法副作用不小,虽然控制台不乱码了,但是一些其他的软件可能会乱码。例如,我用7zip打开一个压缩包,里面的中文文件夹名变成了乱码。
后来我发现其实VS控制台在注册表中也有条目,具体路径如图(我的VS的安装路径是D:\Software\VisualStudio,在注册表中的名称可能会因为安装路径的不同而有所不同,但是最后一定以是VsDebugConsole.exe结尾的)
注:也有人反映注册表中找不到VS控制台的注册表项,对于这种情况我无能为力,如果有知道怎么解决的朋友欢迎补充。
修改的步骤如下(有不明白的步骤可参考上图):
- 按下win+r,输出regedit,打开注册表编辑器
- 在注册表编辑器中打开路径HKEY_CURRENT_USER\Console
- 选中名字中有VsDebugConsole.exe的那个文件夹
- 打开CodePage,修改其值为十进制的65001(即UTF8编码),如果没有CodePage这项,就自己右键新建一个DWORD类型的值,名为CodePage,值为十进制的65001
- 保存(无需重启电脑,会立即生效)
如果一切正常的话,此时我们尝试用VS运行代码,中文应该可以正常显示了,在VS控制台的窗口标题处右键-属性,打开选项页,可以看到当前代码页为65001,表示修改成功,从此,在VS里创建的代码和开启的控制台都会默认用UTF-8编码,乱码的问题就较完美的解决了。