C++安装使用eigen库时出现warning C4819问题的解决方案
C++安装使用eigen库时出现warning C4819问题的解决方案
问题描述
在某个c++工程开发的时候,我使用CMake和vcpkg安装了eigen库,编译器是MSVC,但是出现如图所示的报错
文字内容是
warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss
表示几个Eigen库中的文件中出现了字符无法显示的问题。
问题研究
查阅微软官方文档,表示是编码格式的问题,建议使用utf-8编码格式。
问题解决
由于是warning而不是error,所以可以不去管他,也可以在camke中直接屏蔽这个warning,但是这属于治标不治本的方法,所以经过研究,使用以下方法是可行的。
第一步
在CMakeLists.txt
文件中,添加一行内容
if(MSVC)add_compile_options(/utf-8) # 告诉 MSVC 使用 UTF-8 编码处理源文件
endif()
然而这一步可能能够解决问题,也可能解决不了问题。
第二步
因为如果项目中的一些文件例如main.cpp
文件是使用gbk编码的,仍然可能出现这个报警,所以需要将项目中的所有文件都设置为utf-8编码格式,这样才能解决问题。
使用vscode设置的具体方法为,打开某个文件,查看右下角
然后点击这个gbk,然后会再vscdoe正中上方弹出一个选项框,选择Save with Encoding
,
然后输入utf8,点击选择utf-8
第三步
经过前两步之后,一般都没有什么问题了,然而,这时候仍然可能出现warning,这一步具体是怎么回事我还没有搞清楚,留个坑以后补充。
附录
vscode在变更文件编码格式的时候,Reopen with Encoding
和Save with Encoding
两种方式的区别
Reopen with Encoding
如果使用Reopen with Encoding
,那么文件的原始字节内容没有被改变,而对这个文件的编码格式改变了。
所以,如果一个文件原始是gbk格式,使用Reopen with Encoding
之后用utf8打开,那么显示在你面前的很可能是乱码的。
例如,一个原始文件gbk格式的,内容是汉字“我”,其字节内容是CED2
,那么使用Reopen with Encoding
之后用utf8打开就变成了字符“��”,但其字节内容仍然是CED2
Save with Encoding
如果使用Save with Encoding
,那么vscode在这里为了保证内容正确不乱码,进行了转码。
例如,一个原始文件gbk格式的,内容是汉字“我”,原始字节内容是CED2
,那么使用Save with Encoding
之后用utf8打开仍然是汉字“我”,而原始的字节内容进行了改变,变成了’E68891’。