长期以来,很多人都清楚,一旦C++源码中直接使用了中文,这样的源码想要跨平台(I18N)会非常困难。
随着:Windows下:MSVC2010成为主流
Linux下:GCC升级到4.6
C++中的中文问题 才算有了一个比较优雅的、跨平台的Workaround。
(本文讨论编译器范围:GCC4.6+, MSVC2010sp1+ 。本文属于QString系列,但暂不涉及QString)
C++ 中文问题
要在C++中正确使用中文,必须要了解下面两个概念:源码字符集(the source character set)源码文件是使用何种编码保存的
执行字符集(the execution character set)可执行程序内保存的是何种编码(程序执行时内存中字符串编码)
C++98的问题: 既没有规定源码字符集,也没有规定执行字符集
这个... 如何理解?不妨看个例子
例子
这个要求高么?一个简单的C++程序,只是希望它能在简体中文Windows、正体中文Windows、英文版Windows、Linux、MAC OS...下的结果一致。
//main.cppint main(){ char mystr[] = "老老实实的学问,来不得半点马虎"; return sizeof mystr;}
可以试着反问自己两个问题这个源码文件是何种编码保存的?(有确定答案么?)
mystr中是什么内容?(有确定答案么?)
对C++来说,这两个都不确定。固定平台的话,还能忍忍
要跨平台的话,这种东西...
GCC
在GCC下,这两个都可以使用你自己喜好的编码(如果不指定,默认都是UTF8)-finput-charset=charset-fexec-charset=charset
除了前两个选项外,还有一个:-fwide-exec-charset=charset
wide? 不妨先猜一下它是干嘛的
MSVC
MSVC没有类似前面的选项。源码字符集如何解决?有BOM么,有则按BOM解释,无则使用本地Locale字符集(随系统设置而变)
执行字符集如何解决?使用本地Locale字符集(随系统设置而变)
挺霸道哈(当然,源码中可以使用#pragma setlocale("..."),但