完全解决QT中文码乱问题
发布时间:2021-12-14 12:39 所属栏目:117 来源:互联网
导读:读完本文,让你彻底明白Windows下中文乱码的问题。一劳永逸地解决这个困扰很多同学的问题。 前言 在桌面开发过程中,由于Qt的跨平台特性,以及更加先进的库封装。比起MFC,用着不知道要爽多少。Qt独创的信号槽机制,也大大方便了开发者。可以让开发者把更多的
读完本文,让你彻底明白Windows下中文乱码的问题。一劳永逸地解决这个困扰很多同学的问题。 前言 在桌面开发过程中,由于Qt的跨平台特性,以及更加先进的库封装。比起MFC,用着不知道要爽多少。Qt独创的信号槽机制,也大大方便了开发者。可以让开发者把更多的精力放在业务的逻辑上,而不是语言和库的各种细节上。 可是,在使用的过程中,不少朋友在中文Windows系统下,遇到了乱码的问题。着实头痛,网上搜了一圈,有时能解决问题,有时不知道什么原因的情况下又出现了奇怪的问题。同样的问题在cocos2d-x中也会出现。 上面的问题来自《Cocos2d-x实战:C++卷》,大佬也很无奈啊。 今天,让我们来自己剖析一下这个问题。并最终找到一劳永逸的解决方案。 在开始前,我们先来罗列一下遇到的几种情况: 完全正常。(人品大爆发啊) 直接乱码。(哎,时运不济) 编译报错——C4819,C2001、C2143。(这是犯了什么天条了吗?) 很小心的使用,可能正常。有时正常,有时编译报错,有时末尾的字是乱码,前面的正常。(这是什么鬼啊)。 细心的小伙伴还总结出了,偶数个中文字符正常,奇数个就不行了。后面再加个英文字符,前面的显示正常,后面一个字符乱码。(我也太难了吧~~~) 一、字符编码 要彻底理解这个问题,我们需要从字符编码说起,小伙伴们稍微有点耐心,这个其实很容易理解。字符编码说白了就是一张对照表。 1.1 ASCII编码 这个编码很容易,就用了一个字节进行编码,只能表示英文字符和标点符号。这里我就不过多赘述了,百度一下,就有很多文章有详细讲解。 1.2 中文编码 计算机刚开始被发明的时候,只有ASCII编码。也就是说只有英文,那我们怎么办呢?没有人帮我们做,那只有自己来了,在1980年,国家标准总局发布了GB2312,其实就是一张中文的编码对照表。这也不是很复杂的东西,因为单个字节只有256种可能,也就是说,最多只能表示256种字符。那么我们就再多用一个字节呗,在GB2312中,中文就用2个字节进行表示。2^16 = 65536,有这么多种可能,编码汉字绰绰有余了。 1.3 Unicode编码 在中国使用GBK编码方案的同时,其他国家和地区为了使用自己的文字,也纷纷进行对自己的语言文字进行编码。造成的结果就是,不通用!不同语音的操作系统下编辑的文档,在另一台不同语音的计算机中打开就是乱码。 随着全球化的发展,急需一种统一的编码方案,来解决这种混乱的局面。 二、文件编码 2.1 UTF-8编码 虽然上文中讲到ISO将字符进行了重新编码,并发布了Unicode。每个字符采用2个字节,16位进行编码。对于使用英语的国家来说,原来采用的是ASCII编码,那么所有的文件大小都会变成原来的2倍。这个浪费太大了,于是UTF-8就出现了。 如果用语言描述UTF-8,有些复杂。我们来举个例子,就很容易明白了。 比如,“中”这个字,Unicode编码为:0x4E2D。用二进制写就是(0100-1110-0010-1101),那么用UTF-8,怎么进行表示呢? 1110 0100 1011 1000 1010 1101 我来解释一下,第一个字节,前面的4位中有连续的3个1,表示这个字符需要有3个字节组成。 第二个字节,前面的2位10,表示上接前面的字节,后面的6位是编码。 第三个字节同第二个字节,前面的10和后面的编码。 也就是说,16位的Unicode编码,被分散到3个字节中。 好麻烦啊……的确,遇到中文或其他多字节编码的字符是有点麻烦,但是如果是英文字符,直接就用ASCII编码保存了。直接完全兼容原来的英文文档,他们就是有这么多的优越性,没办法,毕竟计算机技术来自他们那儿。 2.2 ANSI编码 这又是什么编码?细心的小伙伴会发现,你在Windows系统上用记事本编辑完文件,点另存为的时候,右下角默认的编码就是ANSI。这是Windows为了兼容各种不同的编码,而这样做的。 其实,他的做法非常简单,如果遇到小于127的编码,就是ASCII编码,计算机都认识这个编码,对于大于127的编码,也不用管那么多了,按原样保存就行了。 (编辑:ASP站长网) |
相关内容
网友评论
推荐文章
热点阅读