UTF-8编码问题

随着新一代Visual Studio 2022的到来,VS对于UTF-8编码的兼容性提升不能说不大,只能说是一点也没有。

个人开发项目基本是使用VS+Qt开发,两者默认处理编码的不同一直是个烦人的问题。VS在中文系统中使用GB2312或GBK编码,而Qt从源文件读取字符串编码则是默认UTF-8,当存在非ASCII字符时就不可避免产生乱码。
而Qt的多语言翻译工具在读取源文件时需要你的文件编码是UTF-8,否则就会乱码,这让我不得不将所有源文件都保存为UTF-8编码。

随之而来可能会有以下问题:

  • VS编译报错(未识别的字符)
  • VS内无法方便地以UTF-8编码保存文件
  • 控制台输出中文乱码

解决办法:

  • VS项目属性中设置C/C++ -> 命令行添加/utf-8参数;
  • 安装FileEncoding或类似能快速切换编码和保存的插件;
    图1
  • 在需要控制台输出的程序main函数中调用SetConsoleOutputCP(65001);(65001为UTF-8代码页,需要包含Windows.h)

    ...
    #ifdef _WIN32
    #include <Windows.h>
    #endif
    ...
    int main()
    {
    #ifdef _WIN32
    SetConsoleOutputCP(65001);
    #endif
    ...
    }

EditorConfig配置文件

为了更方便自动设置代码样式,还可以通过EditorConfig配置文件配合VS的自动代码清理功能使用。
许多主流的编辑器都支持使用EditorConfig配置文件对整个项目的样式风格进行统一设置,不仅可以设置缩进与对齐等代码样式,还能指定保存的文件编码。

相关链接:
EditorConfig
EditorConfig 设置 - Visual Studio (Windows)

使用方法很简单,只需在项目根目录下创建文本文件.editorconfig,并添加相应条目即可。
我的C++项目主要使用以下配置:

root = true

# 要应用的文件后缀
[*.{c,cc,cpp,cppm,cxx,h,h++,hh,hpp,hxx,inl,ipp,ixx}]

# 文件编码
charset = utf-8
# 换行符
end_of_line = crlf
# 尾部新行
insert_final_newline = true
# 空格或制表符缩进
indent_style = space
# 缩进大小
indent_size = 4
# 去除行尾空格
trim_trailing_whitespace = true