CPP与CodePage最终解决之路

因为https://github.com/shugen002/DesktopLricsFix这个项目再次和Github Action打架。

这个项目是个C++的随手项目吧,中间夹了一堆中文,本地编译还好好的,结果上去编译就给我炸了

1
2>D:\a\DesktopLricsFix\DesktopLricsFix\DesktopLricsFix.cpp(10,15): warning C4566: character represented by universal-character-name '\u7F51' cannot be represented in the current code page (1252) [D:\a\DesktopLricsFix\DesktopLricsFix\DesktopLricsFix.vcxproj]

显然又是一个CodePage的导致的错误,我试了一堆解决方案都不行,最终看了这篇文档后 https://learn.microsoft.com/en-us/cpp/build/reference/utf-8-set-source-and-executable-character-sets-to-utf-8?view=msvc-170 ,发现原来/utf-8实际上是/source-charset:utf-8 /execution-charset:utf-8的结合,根据我项目的实际情况,代码是用UTF-8编写的,而最终执行环境是个简体中文的GB2312,抱着垃圾巨硬的心态试了试本地编译直接加/utf-8,符合预期的乱码了,于是又试了下/source-charset:utf-8 /execution-charset:gb2312,欸,正常了,上传到Github编译一波试试,成了!。

项目配置

成果

解释一下这两个选项吧,/source-charset:utf-8表示源码是个utf-8/execution-charset:utf-8表示最终执行环境是个gb2312,在没有指定的情况下,前者会根据BOM头判断,没有则按系统代码页,而后者则是直接按系统代码页。

在这里,由于Github Action上面的执行环境是个英文的cp1252导致代码中的中文全部寄掉了。

顺带一提,你在msbuild前面加chcp 936 &&之类的做法没用。