在本篇文章中,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)
#include <iostream> void printANSI(); int main() { printANSI(); const char* str = "啊_2"; const wchar_t* wstr = L"啊w_2"; const char* u8str = u8"啊u8_2"; const char16_t* u16str = u"啊u16_2"; std::cout << (int)str[0] << " " << (int)wstr[0] << " " << (int)u8str[0] << " " << (int)u16str[0] << std::endl; }
#include <iostream> void printANSI() { const char* str = "啊_1"; const wchar_t* wstr = L"啊w_1"; const char* u8str = u8"啊u8_1"; const char16_t* u16str = u"啊u16_1"; std::cout << (int)str[0] << " " << (int)wstr[0] << " " << (int)u8str[0] << " " << (int)u16str[0] << std::endl; }
结果:
-80 21834 -27 21834 -80 21834 -27 21834
这两个文件输出的结果是一致的,文件编码不会影响对字符串的编码,MSVC编译结果总结如下:
- 普通的字符串使用ANSI编码
- 宽字符使用UTF-16编码
- 可以显式使用u8将字符串声明为UTF-8编码。
g++(MinGW)测试结果:
-27 21834 -27 21834 -23 37727 -23 37727
g++如果源文件的编码不同是不会成功编译的,如果不是UTF8编码则需要指定参数:-finput-charset=GBK和-fexec-charset=GBK。
文章评论