编译器与字符编码
相关概念
源码字符集(the source character set)
源码文件是使用何种编码保存的
执行字符集(the execution character set)
可执行程序内保存的是何种编码(程序执行时内存中字符串编码)
问题产生的背景
C或C++中没有对源码字符集,执行字符集做规定,导致不同的编译器标准不统一
GCC
源码字符集和执行字符集默认都为UTF-8
且都可以手动指定(-finput-charset, -fexec-charset)
MSVC
源码字符集,有BOM么,有则按BOM解释,无则使用本地Locale字符集(随系统设置而变
执行字符集,使用本地Locale字符集(随系统设置而变)
wchar
wchar
采用unicode编码,具体编码方案与OS相关
- linux
采用UTF-32LE存储
- windows
采用UTF-16LE存储
与编译器相关
对单字节字符串(
char*
),编译器什么也不做,原样复制对宽字节字符串(
wchar_t*
),编译器需要转换GCC
根据源文件编码,将其转换为内部编码(UTF-32LE)
MSVC
源文件需为UTF-8或ANSI编码,将其转换为内部编码(UTF-16LE)