正如前面提到的,C++有窄字符(char)和宽字符(wchar_t)的分别,分别有一
套相应的类和函数(string/cout/strlen与wstring/wcout/wcslen等)。前者在
不同的编译器下有不同的缺省编码(简体中文vc是GB18030,gcc是UTF-8),后
者一般都使用Unicode,其中vc下使用UTF-16,gcc缺省使用UTF-32。
C++在输出窄字符时会按程序内码原样输出,不会进行编码转换,因此在使用窄
字符时要求程序内码与运行环境编码一致,这样才不会出现乱码。由于简体中文
版vc的程序内码是GB18030,因此使用窄字符的vc程序只能运行在GB18030环境下
。同样,由于gcc缺省使用UTF-8作为程序内码,因此使用窄字符的gcc程序只能
运行在UTF-8的终端环境下。(这里说的都是在源代码中直接写中文等非ascii字
符的程序。用前面提到的gettext及其它工具,使用窄字符的程序也可以在不同
编码的运行环境中正确输出中文)
C++在输出宽字符时会自动转换为运行环境的编码,因此只要正确设置了运行环
境编码,同一个程序就可以在不同编码的运行环境中正确显示中文。这一点与
Java/.Net很象,Java/.Net的字符串类型都使用Unicode,在输入/输出时都需要
与当前运行环境的编码进行互转。
一般来说,如果需要支持多语言,有两种比较好的做法:
使用窄字符,但源程序中只使用ascii字符,非ascii字符通过gettext或其它
工具放到单独的文件中,由gettext等工具处理编码转换的问题。
在各种编码的运行环境中均能正确输出中文。
程序中不能直接出现非ascii字符,也不能通过\uXXXX方式指定非ascii字符
,后者也会被编译器转换为非ascii字符并存放在目标文件中。
注释中可以使用ascii兼容的编码,不影响编译器。
有比较多的现成代码可供重用。
使用宽字符。
在各种编码的运行环境中均能正确输出中文。
程序中可以使用非ascii字符。
需要配合前面的源程序文件编码设置,让编译器能正确识别源程序中的非
ascii字符。
由于以前使用宽字符的程序比较少,可供重用的代码较少。
Note如果程序中需要一些固定字符编码的字符串常量,例如固定是GB18030
编码的字符串常量,这些常量应该以\xXX的方式存放字符串常量经GB18030编码
后的内容,这样的内容才不会被转换为程序的内码,也不会转换为运行环境编码
。