- GBK:编码主要用中文编码,包含全部中文字符,GBK的长度为2个字节,所以和GBK相比,UTF-8会占用更多的数据库储存空间。对于GBK编码格式,虽然它的功能少,仅限于中文字符,但它所占用的空间大小会随着它的功能而减少,打开网页的速度比较快。
- GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312
2. QT显示中文乱码
开发环境:VS2015+QT5环境(编译器是VC)。
问题描述:VS+QT编译环境中,如果直接将中文字符串传给QString或QT函数时,会出现乱码。
原因分析:
编译器分析出源文件字符编码之后,会进行解码再编码,将源字符集转码成执行字符集。
- VS2015源字符集编码格式默认是GBK格式,建议保存成UTF-8的格式。
- 执行字符集一般默认使用Windows系统本地字符编码,若是简体中文系统,则是GBK或GB2312字符集。
Qt5中QString内部采用Unicode
字符集,UTF-16
编码。构造函数QString::QString(const char *str)
默认使用fromUtf8()
,将str
所指的执行字符集从UTF-8
转码成UTF-16
。
由上面fromUtf8()
可知,QString需要执行字符集编码为UTF-8,然后以UTF-8进行解码,再编码为UTF-16才能获得正确的字符编码。显示中文乱码的原因其实就是QString转码方式与执行字符集不一致。(比如,源字符集为本地字符集GBK编码,QString以UTF-8的方式进行解码,会导致获得错误的二进制编码,再将错误二进制转为UTF-16就会出现乱码。)
eg:
QString qs = “我是中文”; Srting s = qs.toStdString();
调试时发现s
里面存放的中文字符全部变成了乱码,源字符集为本地字符集GBK
编码,而QString
转码方式是UTF-8编码,导致对源文件进行转码时出现乱码,应将源字符集改为UTF-8编码。
3. 解决方案
3.1 使用fromLocal8Bit()函数
一、Qt默认采用utf-8编码,不能显示Windows默认的本地字符编码(GBK/GB2312/GB18030),使用fromLocal8Bit()函数,将源字符集(utf-8编码)转为执行字符集即loacl字符集(GBK编码),解决中文乱码。
QMessageBox::about(this,QString::fromLocal8Bit("关于"), QString::fromLocal8Bit("中文显示"));
或者Qt5中,提供了一个专门的处理宏,来支持中文常量,那就是QStringLiteral,但它只能处理常量。
QMessageBox::information(this, QString::fromLocal8Bit("关于"), QStringLiteral("中文显示"));
const char* info = "中文显示"; //不支持 QString strInfo = QStringLiteral(info); //支持 QString strInfo = QString::fromLocal8Bit(info);
对于中文常量,使用QStringLiteral即可解决,对于字符串变量,使用QString自带函数也可以轻松解决。
3.1 将VS2015默认编码格式“GB2312”更改为UTF-8
方法一:文件—高级选项—将编码格式“GB2312”更改为UTF-8
但是这个方法只能修改一个文件的编码格式,下面方法可以将项目的所有文件编码格式全部修改(推荐)。
方法二:VS
菜单栏中选择工具—扩展和更新—联机—搜索插件“ForceUTF8”,有两个,选择 (with BOM)的并安装,以后VS
所有源文件和头文件都会保存为“UTF-8+BOM”编码。
方法三:
单一文件修改:
1.源程序中加上如下指令,将源文件的可执行字符集设置为utf-8
#pragma execution_character_set("utf-8") // 本文件为utf-8 编码格式
2.在源程序中的每个中文字符串常量前加前缀u8,比如:QString str = u8“你好”;
整体项目文件修改:将VS2015安装路径的如下目录中的newc++file.cpp文件加上:
#pragma execution_character_set("utf-8") // 本文件为utf-8 编码格式
这样,创建新的cpp时会自动修改文件中的编码格式。
戳戳小手帮忙点个免费的赞和关注吧,嘿嘿。 |