在本篇文章中,Unicode指的是字符集而非UTF-16。

在Windows系统中,UTF8编码会被当作为普通的ASCII编码文件,ASCII是无法储存多字节字符的,所以使用UTF-8并且代码中存在多字节字符时会提示“该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失”,遇到这种情况就是无法正确识别UTF-8文件,所以必须添加一个BOM头,即UTF-8 BOM编码格式,才可以正确识别为UTF-8编码。

在MSVC编译器中,可以使用UTF-8 BOM、其他Unicode编码(UTF-16/UTF-32等)以及ANSI(中文GBK2312)等多字节编码的文件格式,文件使用什么编码,字符串就使用什么编码。

但是在VS2019(16.9)中测试不管是什么编码格式的文件,都不影响对字符串的编码。

以下文件编码分别为UTF-8 BOM与ANSI(GBK2312)

{{EJS0}}
{{EJS1}}

结果:

{{EJS2}}

这两个文件输出的结果是一致的,文件编码不会影响对字符串的编码,MSVC编译结果总结如下:

  • 普通的字符串使用ANSI编码
  • 宽字符使用UTF-16编码
  • 可以显式使用u8将字符串声明为UTF-8编码。

 

g++(MinGW)测试结果:

{{EJS3}}

g++如果源文件的编码不同是不会成功编译的,如果不是UTF8编码则需要指定参数:-finput-charset=GBK和-fexec-charset=GBK。