Qt | QTextCodec类使用详解、GBK和UTF8编码互转、QString的toLocal8bit和toLatin1区别

news2024/11/25 2:55:55

Qt | QTextCodec类使用详解、GBK和UTF8编码互转、QString的toLocal8bit和toLatin1区别


目录

  • Qt | QTextCodec类使用详解、GBK和UTF8编码互转、QString的toLocal8bit和toLatin1区别
      • 1、QTextCodec简介及使用
        • 1.1 编码之间的转换
        • 1.2 解决中文显示乱码问题
      • 2、QString的toLocal8bit和toLatin1


1、QTextCodec简介及使用

1.1 编码之间的转换

Qt使用Unicode来存储、绘制和操作字符串。

unicode是各个编码格式转换的媒介,以UTF-8转到GBK格式为例,需要先将UTF-8转到UNICODE,在通过unicode转到GBK,反之亦然。

Qt提供了一组QTextCodec类,以帮助将非Unicode格式转换为Unicode格式。您还可以创建自己的编解码器类。

支持的编码包括:

  • Big5
  • Big5-HKSCS
  • CP949
  • EUC-JP
  • EUC-KR
  • GB18030
  • HP-ROMAN8
  • IBM 850
  • IBM 866
  • IBM 874
  • ISO 2022-JP
  • ISO 8859-1 to 10
  • ISO 8859-13 to 16
  • Iscii-Bng, Dev, Gjr, Knd, Mlm, Ori, Pnj, Tlg, and Tml
  • KOI8-R
  • KOI8-U
  • Macintosh
  • Shift-JIS
  • TIS-620
  • TSCII
  • UTF-8
  • UTF-16
  • UTF-16BE
  • UTF-16LE
  • UTF-32
  • UTF-32BE
  • UTF-32LE
  • Windows-1250 to 1258

注:gb18030字符集兼容了gbk字符集,以两个字节表示一个文字。

现在假设有一组GBK格式的数据,需要转为unicode格式字符串,那么可以这样:

    QByteArray encodedString = "...";
    QTextCodec *codec = QTextCodec::codecForName("GBK");
    QString string = codec->toUnicode(encodedString);

同样的,如果现在有一组unicode字符串需要转为GBK码数据,那么就是这样:

    QString string = "...";
    QTextCodec *codec = QTextCodec::codecForName("GBK");
    QByteArray encodedString = codec->fromUnicode(string);

以上为简单的使用,还有一个经常遇到的问题就是Qt在windows和linux下中文显示乱码的问题。

1.2 解决中文显示乱码问题

很多新手直接网上一查就是下面三句解决中文乱码问题:

    QTextCodec* codec = QTextCodec::codecForName("GBK");
    // 或者QTextCodec* codec = QTextCodec::codecForName("gb18030 或 gbk 或 utf8");
    QTextCodec::setCodecForCStrings(codec);  // 在qt5中不存在
    QTextCodec::setCodecForTr(codec);        // 在qt5中不存在
    QTextCodec::setCodecForLocale(codec);

这三个函数的作用如下:

setCodecForCStrings(codec):设置QString用于转换const char*和QByteArrays的编解码器。如果编解码器为0(默认值),QString将采用Latin-1。

setCodecForTr(codec):设置QObject::tr()的编码器。如果codec为0(默认值),tr()将采用Latin-1。

setCodecForLocale(codec):将本地编解码器设置为codec,可以由codecForLocale函数返回。如果c是空指针,则编解码器将重置为默认值。对于一些希望使用自己的机制来设置区域设置的应用程序来说,这个功能会有用。

加上这三句后发现真的解决了中文乱码问题!!(固定系统、固定地区语言设置、固定编译环境)。

但是这么干是不对滴!可能换了个系统还是出问题!

那么这三句到底有何作用?下面就详细说一下。

// 获取编解码器名称
qDebug() << QTextCodec::codecForLocale()->name();  // windows下打印GBK,linux下打印utf8

在编写Qt代码的时候使用中文字符串的时候一般会有这三种形式,分别为const char*这种C格式的字符串、QString()进行构造的形式、tr()进行构造的形式:

    QString s1 = "你好";       // 形式1
    QString s2("你好");        // 形式2
    QString s3 = tr("你好");   // 形式3

setCodecForCStrings就是设置的形式一和形式二所用的编码器。

setCodecForTr就是设置使用tr()函数时的所用的编码器。

在Qt4中,如果你没有使用setCodecForCStrings和setCodecForTr指定编解码的方式,那么就会采用Latin-1格式,也就是ASCII。

此时将<你好>这两个中文汉字传入QString,这两个汉字不存在于Latin-1字符集里,自然是会乱码显示,这就是原因!

到了Qt5中,就把setCodecForCStrings和setCodecForTr给去掉了,并将QString()的构造函数默认调用的是fromUTF8,且Qt Creator的文件编码格式默认为UTF-8。

可以从这里看:工具->选项->文本编辑器

而对于使用VS的用户来说,默认编码或者你设置的编码可能是不是UTF8,所以出现了中文显示乱码的问题!这就是Qt5下中文显示乱码的原因!


2、QString的toLocal8bit和toLatin1

QString的toLocal8bit和toLatin1都可以将QString转化为QByteArray,但是两者的区别在于编码的不同。

  • toLocal8Bit:转为本地8bit编码格式。如果字符串包含本地8位编码不支持的字符,则返回的字节数组未定义。前面说过Qt使用Unicode来存储、绘制和操作字符串,执行。执行toLocal8Bit就相当于将unicode编码的qstring转为了本地编码格式,对于windows系统,本地编码格式为GBK,linux系统为UTF-8。

  • toLatin1:以QByteArray的形式返回字符串的Latin-1表示形式。也就是转为了ASCII编码。如果字符串包含非Latin1字符,则返回的字节数组未定义。这些字符可以被抑制或替换为问号。

下面进行示例演示。

    QString s = "你好";

    qDebug() << s.size();                // 输出2(qt用unicode编码格式组织QString)
    qDebug() << s;

    qDebug() << s.toUtf8().size();       // 输出6(UTF8用三个字符表示一个汉字)
    qDebug() << s.toUtf8();              // 转utf8

    qDebug() << s.toLocal8Bit().size();  // 输出4(window下默认编码格式为GBK,一个GBK汉字占两个字节)
    qDebug() << s.toLocal8Bit();         // 转本地编码,也就是GBK格式

    qDebug() << s.toLatin1().size();     // 输出2
    qDebug() << s.toLatin1();            // 转ASCII格式,由于汉字不存在于ASCII编码中,所以会输出两个问号

程序运行结果:


ends…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/52495.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python——基本数据类型的转换

1、为什么需要左数据类型的转换 2、转换为整形&#xff1a; 浮点类型转换为整形&#xff1a; a 3.14 b int(a) print(b) 浮点类型转换成整形的规则是&#xff1a;保留小数点前面的数&#xff0c;去掉小数点和小数点后面的数。 字符串转换成整形&#xff1b; a 123 b int(a…

PHP怎么实现实时聊天?GatewayWorker+Thinkphp5即时通讯系统实现

PHP怎么实现实时聊天&#xff1f;GatewayWorkerThinkphp5即时通讯系统实现 一、项目介绍 后端技术&#xff1a;thinkphp5fastadmingatewayworker 前端技术&#xff1a;jqueryhtmlcsswebsocket 项目实现了简单的登录、注册功能&#xff0c;会员可进行后台管理&#xff0c;主界…

[OpenCV实战]52 在OpenCV中使用颜色直方图

颜色直方图是一种常见的图像特征&#xff0c;顾名思义颜色直方图就是用来反映图像颜色组成分布的直方图。颜色直方图的横轴表示像素值或像素值范围&#xff0c;纵轴表示该像素值范围内像素点的个数或出现频率。颜色直方图属于计算机视觉中的基础概念&#xff0c;其常常被应用于…

Ceres库中参数理解

1 参数含义 2 参考链接 Modeling Non-linear Least Squares — Ceres Solver (ceres-solver.org) Ceres详解&#xff08;二&#xff09; CostFunction_他人是一面镜子&#xff0c;保持谦虚的态度的博客-程序员宝宝_ceres costfunction - 程序员宝宝 (cxybb.com)

Linux基础知识与实操-篇七:用户身份切换与特殊控制

文章目录使用者身份的切换配置sudo单一用户群组处理有限制的命令操作特殊shell与PAM模块Linux用户信息传递与当前系统上其他用户对话建立大量账号最后在理解了前篇 篇六:用户权限控制与账号管理 后&#xff0c;我们继续深入用户权限控制关于用户身份切换、限制特殊权限相关的内…

一步步带你用react+spring boot搭建后台之二(登录与首页篇)

前言 最近半年一直在重庆忙于项目上的事情&#xff0c;博客停更了好久&#xff0c;一直想写2个开源项目: 一个是入门级&#xff1a;一步步带你用reactspring boot搭建后台 一个是olap应用系列&#xff1a;一步步构建olap分析平台 今天开始写第一个系列&#xff0c;完整代码随…

LDO(线性稳压器)设计检查

原理图设计规范检查——LDO&#xff08;线性稳压器&#xff09;设计检查 LDO基本概念&#xff1a; LDO即low dropout regulator&#xff0c;是一种低压差线性稳压器&#xff0c;这是相对于传统的线性稳压器来说的。传统的线性稳压器&#xff0c;如78XX系列的芯片都要求输入电…

Linux cifs挂载远程windows共享目录

Linux cifs挂载远程windows共享目录共享windows目录开启共享权限共享磁盘或目录Linux 先决条件安装Linux依赖开启Administrator 用户使用Username/Password挂载临时挂载自动挂载使用Credentials挂载创建CIFS Windows共享凭证文件临时挂载自动挂载终止挂载共享windows目录 开启…

“算力时代”奔涌而来,JASMINER茉莉发布能效更强劲的X16-Q

11月26日&#xff0c;JASMINER茉莉发布X16系列首款静音型算力产品X16-Q&#xff0c;并同步开启全球预售&#xff0c;将为行业带来更高效、更绿色、更智能的智慧算力。 JASMINER X16相较X4系列产品迎来了全新的“进化”&#xff0c;除去新一代JASMINER茉莉自研高通量芯片的应用…

百看不如一练系列 32个python实战项目列表,得不到就毁掉

前言&#xff1a; 不管学习哪门语言都希望能做出实际的东西来&#xff0c;这个实际的东西当然就是项目啦&#xff0c;不用多说大家都知道学编程语言一定要做项目才行。 这里整理了32个Python实战项目列表&#xff0c;都有完整且详细的教程&#xff0c;你可以从中选择自己想做…

Day2多种抓包工具介绍以及使用封包监听工具找到挑战数据包实现发送数据包进行挑战

工具相关证书安装指南 Charles https://blog.csdn.net/weixin_45459427/article/details/108393878 Fidder https://blog.csdn.net/weixin_45043349/article/details/120088449 BurpSuite https://blog.csdn.net/qq_36658099/article/details/81487491 Fiddler&#xff1a; 是一…

PyQt5 不规则窗口的显示

PyQt5 不规则窗口的显示QPixmap和QBitmap绘图的效果对比不可以拖动的不规则窗口可以拖动的不规则窗口不规则窗口实现动画效果加载GIF动画效果函数描述setMask(self, QBitmap)setMask(self, QRegion)setMask()的作用是为调用它的控件增加一个遮罩&#xff0c;遮住所选区域以外的…

【Android App】实战项目之仿微信的附近的人(附源码和演示 超详细)

需要全部源码请点赞关注收藏后评论区留言私信~~~ 艺术家常说“距离产生美”&#xff0c;其实距离近才是优势&#xff0c;谁不希望自己的工作事少钱多离家近呢&#xff1f;不光是工作&#xff0c;像租房买房、恋爱交友&#xff0c;大家都希望找个近点的&#xff0c;比如58、赶集…

【react-笔记】

目录简介基本使用虚拟dom的两种创建方法jsx语法规则模块与组件、模块化和组件化的理解模块组件模块化组件化函数式组件类式组件组件实例三大属性statepropsrefs事件处理包含表单的组件分类非受控组件受控组件高阶函数_函数的柯里化生命周期引出生命周期理解生命周期(旧)总结新的…

Verilog 延迟反标注

延迟反标注&#xff0c; SDF 延迟反标注是设计者根据单元库工艺、门级网表、版图中的电容电阻等信息&#xff0c;借助数字设计工具将延迟信息标注到门级网表中的过程。利用延迟反标注后的网表&#xff0c;就可以进行精确的时序仿真&#xff0c;使仿真更接近实际工作的数字电路…

当MySQL想恋爱,java和navicate抢着做媒婆 ------ java连接MySQL数据库 navicat for MySQL 连接

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 **收录于专栏 数据库 ⭐当MySQL和java通过媒婆navicate谈上了恋爱⭐ 文章目录⭐当MySQL和java通过媒婆navicate谈上了恋爱…

Linux 多线程

目录 一.线程概念 1.什么是线程 2.页表 &#xff08;1&#xff09;页表结构 &#xff08;2&#xff09;好处 3.线程优点 4.线程缺点 5.线程异常 6.线程用途 7.进程和线程的 8.简单使用线程 二.线程控制 1.使用线程 2.线程栈和pthread_t 3.线程的局部存储 4.分离…

[附源码]计算机毕业设计springboot室内设计类网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

R语言中的划分聚类模型

划分聚类 是用于基于数据集的相似性将数据集分类为多个组的聚类方法。我们围绕聚类技术进行一些咨询&#xff0c;帮助客户解决独特的业务问题。 【视频】KMEANS均值聚类和层次聚类&#xff1a;R语言分析生活幸福质量系数可视化实例 KMEANS均值聚类和层次聚类&#xff1a;R语言分…

GUI自动化测试工具Sikulix的安装和使用

从程序内部控制对小白来说太难了&#xff0c;所以使用一下自动化测试的工具直接控制按钮达到我的目的 一个比较好的自动化测试工具是Sikulix&#xff0c;这里记录一下安装和基本的使用 下载和安装 官网&#xff1a;http://www.sikulix.com/ 下载对应系统的.jar需要使用java&…