首页 > 其他分享 >[字符编码] 实战篇:QT中文乱码的解决办法

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

时间:2023-12-22 21:03:46浏览次数:31  
标签:中文 编码 实战篇 UTF QT 字符集 GBK 乱码 QString

  • 作者: 丶布布

1. 编码科普

常见的两种编码是:UTF-8和GBK:

  • UTF-8:编码包含全世界所有国家需要用的字符,它比较灵活,长度在1-6个字节,UTF-8编码格式很强大,支持所有国家的语言,如果你的网站涉及到多个国家的语言,那么建议你选择UTF-8编码。正是因为它的强大,才会导致它占用的空间大小要比GBK大,对于网站打开速度而言,也是有一定影响的。
  • 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编码。

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


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

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


但是这个方法只能修改一个文件的编码格式,下面方法可以将项目的所有文件编码格式全部修改(推荐)。方法二:VS菜单栏中选择工具—扩展和更新—联机—搜索插件“ForceUTF8”,有两个,选择 (with BOM)的并安装,以后VS所有源文件和头文件都会保存为“UTF-8+BOM”编码。

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


方法三:

单一文件修改

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时会自动修改文件中的编码格式。


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

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

标签:中文,编码,实战篇,UTF,QT,字符集,GBK,乱码,QString
From: https://blog.51cto.com/u_16436086/8938556

相关文章

  • [Qt5] Error starting process C:\Qt\Qt5.12.0\5.12.0\msvc2015\bin\moc.exe:
    作者:丶布布文章预览:问题解决方式问题把工程代码从电脑A拷贝到电脑B,环境vs2015+QT5.12,出现如下错误:ErrorstartingprocessD:\Qt\Qt5.12.0\5.12.0\msvc2015\bin\moc.exe:系统找不到指定的文件经排查后发现电脑A使用的Qt版本是QT5.12.0,电脑B使用的Qt版本是QT5.12.1,程序在电脑A上......
  • C++ Qt开发:Charts绘图组件概述
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QCharts二维绘图组件的常用方法及灵活运用。QtCharts提供了一个强大且易于使用的工具集,用于在......
  • Go实战篇 1
    猜谜游戏游戏通过程序生成一个随机数让玩家进行猜测,玩家输入一个数字后,程序给出提示:该数字是大于还是小于随机数,直至玩家猜对为止,退出程序。如何获得随机数?在Go中,使用math/rand包中的函数生成随机数,如下:funcmain(){ maxNum:=100 //用于指定随机数的上界 rand.Seed(tim......
  • QTreeWidget使用小案例
    一、概述使用QTreeWidget制作一个树形菜单。示例图: 二、代码示例#include"TreeWidgetExampleWindow.h"TreeWidgetExampleWindow::TreeWidgetExampleWindow(QWidget*parent):QWidget(parent){this->setWindowTitle("TreeWidget组件");QVBoxLayout*......
  • javaWeb中文乱码
    问题归类1.登录时无法用中文名登录2.页面修改数据,后端传入乱码解决方法1.数据库看看数据库编码集是不是中文编码集如果不是可以在数据库中运行下面语句ALTERDATABASE数据库CHARACTERSET=utf8mb42.数据库连接关键是characterEncoding=utf8没有的加上url=jdb......
  • QTabWidget小案例
    一、概述编写一个QTabWidget小案例,示例图:  二、代码示例#include"TabWidgetExampleWindow.h"TabWidgetExampleWindow::TabWidgetExampleWindow(QWidget*parent):QWidget(parent){this->setWindowTitle("TabLayout布局");QVBoxLayout*vLayo......
  • C++ Qt开发:StandardItemModel数据模型组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍StandardItemModel数据模型组件的常用方法及灵活运用。QStandardItemModel是Qt中用于存储标准......
  • Qt/C++视频监控Onvif工具/组播搜索/显示监控画面/图片参数调节/OSD管理/祖传原创
    一、前言能够写出简单易用而又不失功能强大的组件,一直是我的追求,简单主要体现在易用性,不能搞一些繁琐的流程和一些极难使用的API接口,或者一些看不懂的很难以理解的函数名称,一定是要越简单越好。功能强大主要体现在功能的完整性,常规的接口肯定是必备的,然后在默认值方面,尽量将值设......
  • Qt在ui界面设置组件样式,styleSheet属性
    QGroupBox{border:3pxsolidred;border-radius:15px;} QGroupBox#groupBoxBtns{border:3pxsolidgreen;border-radius:5px;} QPushButton{border:3pxsolidblack;border-radius:7px;} QPushButton:hover{border:3pxsolidblue;border-radiu......
  • 03使用VS开发QT程序入门篇
    开发第一个Qt程序学习Qt前最好先学习一下C++语言基础,了解基本的C++语法,比如面向对象编程的三大核心(封装、继承、多态等)第一步,打开VS2022,并点击创建新项目先找到Qtconsleapplication,创建一个简单的Qt控制台程序,单击下一步。取好对应项目的文件名,选好对应的存储路径。文件名应当使......