page contents

C++编程中的字符编码转换

源代码文件(源码字符集)经过编译/链接,生成可执行文件(执行字符集),最后程序运行于实际环境中(运行环境编码).............

attachments-2021-09-8sttCu7S614c2314c04d7.png


在写跨平台的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

ASCIIISO-8859-1 这种用1个字节编码的字符集,叫做单字节字符集(SBCS - Single-Byte Character Set)。

 

多字节字符集(MBCS - Multi-Byte Character Set

GB2312GBKGB18030这种用1-24个不等字节编码的字符集,叫做多字节字符集(MBCS - Multi-Byte Character Set)。

 

GB2312GBKGB18030

GB18030:最新汉字编码字符集,向下兼容GBKGB2312

GBK:汉字扩展编码,向下兼容GB2312, 并包含BIG5(繁体)全部汉字;

GB2312:简化汉字编码字符集;

 

源码字符集

不同工具新建的源码文件编码格式不同

源代码都是由不同操作系统的不同编辑工具产生的,不同工具新建的源码文件编码格式不同,比如拿我电脑来说:

 

1.Windows下用VS2010新建的源码文件是GB2312编码格式。

2.Windows下用notepad++新建的源码文件是UTF-8编码格式。

3.Linux下用VI新建的源码文件是UTF-8格式。

 

以上就是有关C++编程中的字符编码转换的相关内容了,想要了解更多有关c++的其它知识也可关注六星社区网站。 

想要高效学习,指路微信公众号——【python编程学习圈】每日分享学习干货,关注即可免费领取整套Python零基础到入门资料及学习教程,走过路过,千万不要错过!!快行动起来!!

attachments-2022-05-ZwUUz0Co628f2e3079c7b.jpeg

  • 发表于 2021-09-23 14:49
  • 阅读 ( 486 )
  • 分类:C/C++开发

0 条评论

请先 登录 后评论
小柒
小柒

1474 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章