[字符编码] 实战篇:QT中文乱码的解决办法

简介: [字符编码] 实战篇:QT中文乱码的解决办法
  • 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时会自动修改文件中的编码格式。


戳戳小手帮忙点个免费的赞和关注吧,嘿嘿。

姐妹篇:[字符编码] 理论篇:常见字符集与编码方式


目录
相关文章
|
5月前
|
Windows
qt中编译错误:error: C2001: 常量中有换行符的解决办法
qt中编译错误:error: C2001: 常量中有换行符的解决办法
Qt 之未定义标识符“qFlagLocation“解决办法
Qt 之未定义标识符“qFlagLocation“解决办法
|
6月前
|
API
QT中使用 WinExec API 参数不支持中文路径的解决办法
在QT中使用WinExec时,发现如果调用外部程序,如果路径或者参数含有中文路径,可能导致无法打开应用程序或者无法使用参数,解决办法,下面是简单的解决办法
201 0
|
缓存
《QT从基础到进阶·二十二》QGraphicsView显示大量图形项item导致界面卡顿的解决办法
《QT从基础到进阶·二十二》QGraphicsView显示大量图形项item导致界面卡顿的解决办法
596 0
Qt在线安装时出现网络错误的解决办法(Windows)
Qt在线安装时出现网络错误的解决办法(Windows)
|
编译器
Qt没有被正确安装,请运行make install -- 问题的解决办法
Qt没有被正确安装,请运行make install -- 问题的解决办法
1262 0
|
编译器 C++
使用vs编译QT项目一直提示 machine type 不匹配的问题解决办法
使用vs编译QT项目一直提示 machine type 不匹配的问题解决办法
121 0