C++编译中文乱码,还不会解决?

        不知道各位同学在学习C/C++使用的是什么工具:codeblocks,vs,vscode?不论是什么工具,只要用得顺手,就是好工具。只不过有些同学偏爱于命令行,使用g++编译器更喜欢一些,这个时候,就不得不掌握好g++编译器的常用命令了。

g++编译命令

c程序一般要经过编译和链接两个过程

编译过程使用 -c 参数选项

g++ -c task.cpp
g++ -c xiaoxi.cpp

链接过程使用 -o 参数选项

g++ -o xi xiaoxi.cpp task.cpp

可以看到,先写目标文件名称 xiaoxi,再写需要连接的 .o 文件,执行完后,我们就得到了一个名为 xi.exe 的文件了。

最后,直接在 xi.exe 所在文件夹打开终端

.\xi

这样,就可以成功执行我们的程序了,对吧。

不过看起来太麻烦了,不如使用 IDE 集成工具。那么我们就进行一个小小的优化,将这些命令写到一个 .bat 批处理文件中,然后通过执行这个批处理文件,快速得到可执行程序。

del xi.exe
g++ -c task.cpp xiaoxi.cpp
g++ -o xi task.o xiaoxi.o
del xiaoxi.o
del task.o
.\xi

我们自己边做开发,新建的 .cpp 文件依次按照上面的格式加入整体编译,就可以毫无顾忌了。

只不过可惜的是,结果令人大失所望,我们的 exe 文件产生了,但是最终的执行结果里,所有的中文字符全都乱码了,中文 “你好,世界” 变成了如下图所示的样子,哭

 为什么呢?

乱码产生的原因

当乱码产生时,一般就会想到,这应该是编码和解码所使用的字符集不同而导致的,那这里我们就不得不提到 utf-8 和 gbk 两种我们常用的字符集了,前者也成为万国码,而后者则是国家标准。

windows系统安装后,我们选择语言时选择了简体中文,那么编码集就是 gbk。

可有时我们也会看到我们有些文件的编码是 ANSI,可以ANSI不是美国的国标么,为什么在这个标准下我们的中文也能够支持,哎,这就不得不提到,ANSI在中文里就是 gbk,如果在霓虹及,就是霓虹及的国标了。

我们使用命令行时,命令行中的编码也应该是  ANSI 即 gbk,命令行执行 xi.exe 的过程就可以理解为解码过程,那么,很容易得出,解码使用 gbk 出错,难道编码的字符集不是 gbk?

恭喜你,答对了!!!

g++ 编译器编译文件时,默认就是选择使用 utf8 进行编码,那么得到的文件应当使用 utf8 进行解码才能实现咯,而我们选择的命令行默认使用了 gbk,自然无法得到正确的结果,从这个角度出发,就有了第一种解决方案

解法1:更换命令行的解码字符集

闲话少说,更换命令行的解码字符集命令为 chcp,参数为一个整型数字,代表更换的字符集。

更换为 utf8 

chcp 65001

值得注意的是,更换字符集仅对当前行命令有效,换句话说,要将执行的命令跟在这条语句后

chcp 65001 && .\xi

注意:在 powershell 环境中,使用分号作为命令分隔符。

别说,还真有效,结果中显示出了正确的中文显示

乱码是不乱码了,但是我还是觉得膈应着慌,如果希望执行文件每次都这样做,真的很麻烦,能不能就将可执行文件的编码改成 gbk 呢,这样我也不需要每次都这么麻烦了

可以!但是还得深入学习以下 g++ 的两个参数

解法2: 修改g++编译参数

-finput-charset 指定要读取的源文件的编码,默认是UTF-8

-fexec-charset 指定输出的 exe 文件的编码(中文)格式,默认UTF-8

 可以看到,finput 参数就是指定 a 编码,而 fexec 指定的是 b 编码,源文件是由什么编码的,那么读取时就要用这种编码,否则就可能会出问题

但是幸好有默认值 utf-8,而我们的源文件也正好是 utf-8 编码的。

可是输出格式我们可操作空间就大得多了,除了默认值的 utf-8,还可以选择 gbk 等。

不对!!,默认是 utf-8,即输出的 exe 文件格式是 utf-8,我们用命令行(gbk)执行必然会中文乱码!

要是,要是将 exe 文件的输出格式调整为 gbk,那样岂不是可以直接执行了!!

del xi.exe
g++ -c task.cpp -fexec-charset=gbk
g++ -c xiaoxi.cpp -fexec-charset=gbk
g++ -o xi task.o xiaoxi.o 
del xiaoxi.o 
del task.o 
.\xi 

果真,执行结果正确了,免去了繁琐的配置

至此,问题解决了,由于编码解码的 bug,给编程学习带来了很多不变,真希望未来统一 utf-8,虽然有许多不可抗因素和顾虑,但还是希望这一天早日到来。

希望这一篇博客能给大家带来帮助! 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未来可期ww

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值