相关概念

源码字符集(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)

参考

  1. http://blog.csdn.net/dbzhang800/article/details/7540905
  2. C/C++ 编译后的二进制程序中字符串的保存方式

留言