字符编码和Qt中文乱码相关问题这里都给理清楚了

前言

本文可以帮你彻底理清Qt程序中的中文乱码问题,做到不但知其然并且还能知其所以然。做中文软件开发的朋友应该都遇到过中文乱码问题,遇到这种情况,很多人都是百度一下,学到一个方法,放到程序里一试,见到确实有效,然后就丢在那不管了。这样做关键的问题有两个:一是很容易出现,在这个情况下有效,但到了另一个情况就无效了,还要找其他的方法去处理;二是有些东西根本就不是处理字符编码问题的,但用了确实能解决乱码问题,就会造成乱用的现象,典型的例子就是Qt4中的QTextCodec::setCodecForCStrings,由于滥用在Qt5中被删了。

我们是内网开发,代码考出来很费劲,测试代码就不贴了,这里只和大家分享一下经验总结。

字符编码

一提字符编码,大家脑海中立马想起什么u8,gbk,Unicode等等,但很多人分不清这些编码的关系,这里先理清楚这些编码都是什么东西,理清这些以后,再处理中文乱码的问题就简单明了了。

ASCII

众所周知,计算机是美国人搞出来的,美国人讲英语,英语又只有26个字符,只要对这26个字母进行编码,就可以表示出所有的英文单词。当时的美国人天然的就想到了,用一个字节就能表示这些字符。一个字节8位,可以表示256种字符,英文字母的大小写加上0到9这10个数字,甚至加上各种标点符号也用不了256个字符。在实际的编码过程当中,其实只编到第127个就够美国人用了,美国人觉得这样挺好,就制定了一个美国人自己用的标准,这就是ASCII ((American Standard Code for Information Interchange)编码。在初学C语言的时候,我们常说的数字97等于字符a,数字48等于字符0,说的就是这个ASCII码的对应关系。

ASCII扩展码

后来计算机传到其他国家,发现有些本国的字符在ASCII中没有,ASCII中没有就没办法用计算机表示,那这么办?后面不是还有128到255这么多的编号没用吗?于是这些国家的人们就把这些编号用了起来,编入到ASCII剩余的位置,这就是ASCII扩展码。

gb2312

等到中国人开始使用计算机的时候,就有点懵逼了,中文常用的汉字就6000多个,您这才二百来个编码哪够用啊?但这也难不倒聪明的中国人,一个字节8位256个编码不够用,那我扩展一下,使用两个字节,16位,有65536个编码位,几千个汉字足够用了。不但自己够用,甚至还能兼容英文的。于是中国人自己搞出来一个16位的编码,其中前127个和ASCII一样,后面的是我们自己的东西,这套编码就是gb2312。同时在这套编码中,不但保留了原有的ASCII的标点符号,我们还自己编制了一些中文的标点符号,原先ASCII的就是俗称的半角符号,后来新编的就是俗称的全角符号。在中文计算机的世界,有一句经常听到的话,“英文占一个字节,汉字占两个字节”,说的就是这套编码。

gbk和gb10830

随着计算机在国内的普及,发现光有常用字不行,生僻字也要有,于是就在gb2312的基础上,扩展了一些生僻字,这就是gbk。同时也别忘了,我们是多民族国家,汉字有了,还有那些少数民族呢,他们的文字也需要进计算机,于是在gbk的基础上继续扩展,加入了少数民族的文字,这套编码就叫gb10830。

Unicode

至此,一切都显得很美好对不对?但是不要忘了,我们说的只是我们国内自己的事,要知道,全世界这么多国家,这么多语言文字,每个国家都搞出来一套自己的编码,这不乱了套了。

后来,国际标准化组织看不下去了,制定出一套包含全世界所有语言文字的编码,大家都用这套编码,免得乱七八糟的,谁也不认识谁,这套编码就是Unicode。

utf是到底是什么

但是Unicode只是一套标准,它只是规定了数字多少对应哪个字符,但它不是计算机内部可用的具体实现,数字和字符的对照表,人类看得懂,但计算机他看不懂啊,就需要有给具体的方案将这张对照表输入到计算

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

木千

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

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

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

打赏作者

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

抵扣说明:

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

余额充值