关于C程序编码问题

关于C程序编码问题

ID:36538484

大小:118.48 KB

页数:8页

时间:2019-05-11

关于C程序编码问题_第1页
关于C程序编码问题_第2页
关于C程序编码问题_第3页
关于C程序编码问题_第4页
关于C程序编码问题_第5页
资源描述:

《关于C程序编码问题》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、关于C++程序的编码问题学习各种外挂制作技术,马上去百度搜索"魔鬼作坊"点击第一个站进入、快速成为做挂达人。我们传统的程序基本都只在Windows或只在Linux下运行,Windows程序使用简体中文GB18030编码,Linux程序则只使用英文,多年以来这些程序运行起来都没有问题。近年来,随着程序的组件化,部分代码特别是公用组件都需要同时支持Windows及Linux平台,这样就出现了不同程度的编码问题,例如在编译时编译器报错,或者在运行时出现乱码。这些问题都和程序选用的字符编码不正确有关。本文简要地分析了C++的一些字符编码问题,并提供了建议

2、的方案。受经验和时间的限制,有些内容可能不一定全面,仅供大家参考。1.C++源文件的编码需要特别考虑吗?1.1.几个相关概念首先要区分几个概念:C++源文件的编码指的是C++源程序文件(。cpp/.h)本身使用什么字符编码(GB18030/UTF-8等)。C++程序的内码编译后,C++中的字符串常量都会变成一串字节存放在可执行文件中。这个内码指的就是在可执行文件中,字符串以什么编码进行存放。这里的字符串常量指的是窄字符(char)而非宽字符(wchar_t)。宽字符通常是以Unicode(VC使用UTF-16BE,gcc使用UTF-32BE)存放

3、。运行环境编码指的是执行程序时,操作系统或终端所使用的编码。程序中输出的字符最终要转换为运行环境编码才能正确显示,否则就会出现乱码。1.2.各种环境下通常使用的编码C++源文件的编码通常在简体中文Windows环境下,各种编辑器(包括VisualStudio)新建文件的缺省编码都是GB18030,所以不特别指定的话,Windows环境下C++源文件的编码通常为GB18030。而在Linux环境下,最常使用,也是推荐使用的是UTF-8编码。C++程序的内码一般来说,我们常用的简体中文版VC所使用的内码是GB18030,而gcc/g++使用的内码缺省

4、是utf-8,但可以通过-fexec-charset参数进行修改。Note可以通过在程序中打印字符串每个字节十六进制形式来判断程序所使用的内码。运行环境编码我们常用的简体中文版Windows的环境编码是GB18030,而Linux下最常用的环境编码是UTF-8。1.3.这几个编码之间的关系源程序需要由编译器编译为目标文件,目标文件运行后输出信息到终端,因此这几个编码之间存在一些的关联:+--------+

5、源程序

6、----------源文件编码+---+----+

7、编译器编译+---+----+

8、目标文件

9、----------程序内码+---+-

10、---+

11、运行后输出信息+---+----+

12、输出

13、----------运行环境编码+--------+编译器需要正确识别源文件的编码,把源文件编译为目标文件,并把源文件中的以源文件编码的字符串转换为以程序内码编制的字符串保存在目标文件中。Note当源文件的字符编码与程序内码都是UTF-8时(gcc的缺省情况),gcc似乎并不会对源文件中的字符编码进行转换,而是直接把字符串原样存放到目标文件中,在这种情况下,源程序中的GB18030编码的字符串在输出时仍然为GB18030编码。但如果在其它源文件字符编码的实际值与编译选项不同时,会在编译时报无法从

14、XXX转换到UTF-8的错,因此还不清楚为什么两个编码都是UTF-8时,GB18030编码的源文件能通过编译。C++标准库需要正确识别终端的运行环境编码,并把程序的输出转换为运行环境所使用的编码,以便正确显示。在这过程中,如果有一个环节出现问题,就会导致程序的输出发生异常,产生乱码或其它更严重的后果。2.源文件应该采用什么编码?2.1.编译器对不同源文件编码的支持一样吗?gcc/vc各版本对C++源文件编码有不同的处理:gcc(v4.3.220081105):支持UTF-8编码的源文件,UTF-8编码的源文件不能有BOM。开始支持带BOM的UTF

15、-8文件。vc2003:支持UTF-8编码的源文件,UTF-8编码的源文件可以有BOM,也可以没有。vc2005+:如果源文件使用UTF-8编码的话,必须有BOM。Notegcc提供了-finput-charset参数可以指定源文件的字符编码,但由于标准头文件都是ascii编码的,因此如果要引用标准头文件的话,源代码的编码必须兼容ascii。而vc未能找到类似的选项。2.2.源文件应该采用什么编码?很多文章都推荐C/C++代码中只使用ascii字符,如果有非ascii字符可以用xHH或uXXXX表示。注释中建议使用utf-8编码。也可以使用g

16、ettext把非ascii字符串放到单独的语言文件中,而在源代码中只保留ascii字符。在实践中,由于xHH或uXXXX等方式很不直

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。