关于C++程序的编码问题
作者:网络转载 发布时间:[ 2014/1/17 9:28:58 ] 推荐标签:C++ 程序
我们传统的程序基本都只在Windows或只在Linux下运行,Windows程序使用简体中文GB18030编码,Linux程序则只使用英文,多年以来这些程序运行起来都没有问题。
近年来,随着程序的组件化,部分代码特别是公用组件都需要同时支持Windows及Linux平台,这样出现了不同程度的编码问题,例如在编译时编译器报错,或者在运行时出现乱码。这些问题都和程序选用的字符编码不正确有关。
本文简要地分析了C++的一些字符编码问题,并提供了建议的方案。受经验和时间的限制,有些内容可能不一定全面,仅供大家参考。
1. C++源文件的编码需要特别考虑吗?
1.1. 几个相关概念
首先要区分几个概念:
C++源文件的编码指的是C++源程序文件(.cpp/.h)本身使用什么字符编码(GB18030/UTF-8等)。
C++程序的内码编译后,C++中的字符串常量都会变成一串字节存放在可执行文件中。这个内码指的是在可执行文件中,字符串以什么编码进行存放。这里的字符串常量指的是窄字符(char)而非宽字符(wchar_t)。宽字符通常是以Unicode(VC使用UTF-16BE,gcc使用UTF-32BE)存放。
运行环境编码
指的是执行程序时,操作系统或终端所使用的编码。程序中输出的字符终要转换为运行环境编码才能正确显示,否则会出现乱码。
1.2. 各种环境下通常使用的编码
C++源文件的编码
通常在简体中文Windows环境下,各种编辑器(包括Visual Studio)新建文件的缺省编码都是GB18030,所以不特别指定的话,Windows环境下C++源文件的编码通常为GB18030。
而在Linux环境下,常使用,也是推荐使用的是UTF-8编码。
C++程序的内码
一般来说,我们常用的简体中文版VC所使用的内码是GB18030,而gcc/g++使用的内码缺省是utf-8,但可以通过-fexec-charset参数进行修改。
Note
可以通过在程序中打印字符串每个字节十六进制形式来判断程序所使用的内码。
运行环境编码
我们常用的简体中文版Windows的环境编码是GB18030,而Linux下常用的环境编码是UTF-8。
1.3. 这几个编码之间的关系
源程序需要由编译器编译为目标文件,目标文件运行后输出信息到终端,因此这
几个编码之间存在一些的关联:
+--------+ | 源程序 |----------源文件编码 +---+----+ | 编译器编译 +---+----+ |目标文件|----------程序内码 +---+----+ | 运行后输出信息 +---+----+ | 输出 |----------运行环境编码 +--------+
编译器需要正确识别源文件的编码,把源文件编译为目标文件,并把源文件中的以源文件编码的字符串转换为以程序内码编制的字符串保存在目标文件中。
Note
当源文件的字符编码与程序内码都是UTF-8时(gcc的缺省情况),gcc似乎并不会对源文件中的字符编码进行转换,而是直接把字符串原样存放到目标文件中,在这种情况下,源程序中的GB18030编码的字符串在输出时仍然为GB18030编码。但如果在其它源文件字符编码的实际值与编译选项不同时,会在编译时报无法从XXX转换到UTF-8的错,因此还不清楚为什么两个编码都是UTF-8时,GB18030 编码的源文件能通过编译。
C++标准库需要正确识别终端的运行环境编码,并把程序的输出转换为运行环境所使用的编码,以便正确显示。
在这过程中,如果有一个环节出现问题,会导致程序的输出发生异常,产生乱码或其它更严重的后果。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11