在写跨平台的C/C++代码过程中(本文的研究只限于C/C++范畴),经常会遇到中文字符串乱码的问题。比如,同一个源码,用MSVC编译/运行能正常显示中文字符串,但在linux下编译/运行显示中文字符串就乱码。导致这种现象的根源就在于字符集编码不匹配导致,如果你彻底理解了以下几个字符集的概念,以及编程过程中哪些因素会影响这些字符集,将有助于你从根源上解决乱码问题。
乱码的根源
源代码文件(源码字符集)经过编译/链接,生成可执行文件(执行字符集),最后程序运行于实际环境中(运行环境编码)。在这过程中如果有字符集不匹配,最终就无法显示预期的文字信息,甚至产生乱码。
(1)、编译器在编译源代码时,会将源码字符集转化为执行字符集,如果编译器不能正确识别源码字符集,就得不到正确的字符串数据。
(2)、可执行文件在实际运行环境中执行时,为了在控制台(或者其他UI)上显示出字符串,就要将执行字符集转化为运行环境的字符集。如果运行环境的字符集与执行字符集不同,也会导致乱码。
因此,要想程序不乱码,必须满足以下因素:
(1)、编译器准确识别了源码字符集,从而得到正确的字符串数据(执行字符集)。
(2)、运行环境的编码与执行字符集相同。
字符集
C locale
ANSI 发布的字符编码标准,编码空间 0x00-0x7F,占用1个字节,上学时学的 C 语言书后面的字符表中就是它,因为使用这个字符集中的字符就已经可以编写 C 程序源代码了,所以给这个字符集起一个 locale 名叫 C,所有实现的 C 语言运行时和系统运行时,都应该有这个 C locale,因为它是所有字符集中最小的一个,设置为其它 locale 时可能由于不存在而出错,但设置 C 一定不会出错,比如:当 Linux 的 LANG 配置出错时,所有的 LC_* 变量就会被自动设置为最小的 C locale。
单字节字符集(SBCS - Single-Byte Character Set)
像ASCII、ISO-8859-1 这种用1个字节编码的字符集,叫做单字节字符集(SBCS - Single-Byte Character Set)。
多字节字符集(MBCS - Multi-Byte Character Set)
像GB2312,GBK,GB18030这种用1-2、4个不等字节编码的字符集,叫做多字节字符集(MBCS - Multi-Byte Character Set)。
GB2312,GBK,GB18030
GB18030:最新汉字编码字符集,向下兼容GBK,GB2312;
GBK:汉字扩展编码,向下兼容GB2312, 并包含BIG5(繁体)全部汉字;
GB2312:简化汉字编码字符集;
源码字符集
不同工具新建的源码文件编码格式不同
源代码都是由不同操作系统的不同编辑工具产生的,不同工具新建的源码文件编码格式不同,比如拿我电脑来说:
1.在Windows下用VS2010新建的源码文件是GB2312编码格式。
2.在Windows下用notepad++新建的源码文件是UTF-8编码格式。
3.在Linux下用VI新建的源码文件是UTF-8格式。
以上就是有关C++编程中的字符编码转换的相关内容了,想要了解更多有关c++的其它知识也可关注六星社区网站。
想要高效学习,指路微信公众号——【python编程学习圈】每日分享学习干货,关注即可免费领取整套Python零基础到入门资料及学习教程,走过路过,千万不要错过!!快行动起来!!
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!