【Qt】总体把握文本编码问题

这篇具有很好参考价值的文章主要介绍了【Qt】总体把握文本编码问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在项目开发中,经常会遇到文本编码问题。文本编码知识非常基础,但对于新手来说,可能需要花费较长的时间去尝试,才能在脑海中建立对编码的正确认知。文本编码原理并不难,难的是在项目实践中掌握正确处理文本编码的方法。本文从项目实践出发,总结了项目中编码处理的相关经验,希望可以帮助基础比较薄弱的同学,快速建立对编码的基本认知,同时减少实际项目中踩坑的几率。

1. 从不同的视角看数据

1.1 计算机最底层视角

从计算机最底层的视角看,计算机中的数据,不管是寄存器中的数据,还是内存中的数据,还是磁盘上的文件数据,都是以0和1的二进制格式存放的。所以,一般在说二进制数据时候,是从计算机最底层的视角而言的。

1.2 计算机应用视角

应用程序处理计算机中的数据时,只有遵循数据创建者对数据格式的约定,对数据进行处理,才能正确提取出文件内容创建者所想要表达的信息。

文件创建者通常使用文件后缀名来标明文件内容格式。常见的文件格式后缀名有:.jpg、.txt、.mp4 等。

处理数据时,是否遵循数据格式约定,完全由应用程序决定,程序认为它是什么格式,就可以以什么格式对数据进行处理。如果使用和约定不一致的格式处理数据,那么从数据中提取出的信息极有可能是混乱的、无用的。例如,使用文本编辑器打开一张图像,最终文本编辑器的显示内容将是一堆乱码,无法阅读。实际项目中文本出现乱码问题也是这个原因。

2. 文本乱码问题分析

2.1 文本编码简介

对世界上所有符号、文字进行编号,产生一张字符表,这个表叫做“字符集”。这样一来,我们可以使用数字编号来表示字符,每个编号占用相同的字节数。因为世界上的字符很多,一般使用32位的无符号整型存储编号,总计大约可以表示42亿种字符。目前通用的字符集是Unicode字符集。

字符集中,有的字符使用频繁,有的字符使用不频繁,使用相同字节长度的数字编号会有些浪费存储空间。改进的存储方案类似于哈夫曼编码:将使用频繁的字符用更少的字节数表示,使用不频繁的字符,用较长的字节数表示。经过优化的存储方式,叫做“文本编码”。

文本有很多种编码格式,如GBK,GB18030,UTF-8等等,目前最常用的文本编码格式是UTF-8。编码的具体实现不是本文的主要内容,所以不作展开。

2.1 文本乱码原因

由于计算机最早由老外发明,所以各种文本编码格式对英文的兼容性最好,所以英文通常不会乱码。而同一个中文汉字,用不同的文本编码格式进行编码后,对应的二进制数据是不同的。反过来,同一段文本数据,使用不同的编码进行文本解码,则会解析出来截然不同的文本内容。

总的来说,文本乱码有两个原因:

  • 一段数据本身就不是文本数据,可能是图像数据,也可能是视频数据等非文本类型的数据,如果将其视作文本进行解码,必然会导致乱码。
  • 我们编写的应用程序,没有采用正确的文本编码格式对文本数据进行解码,导致输出的文本就会出现严重混乱,即乱码,进而导致程序处理结果偏离预期,出现错误。

2.2 文本乱码的处理思路

根据文本乱码的原因,我们在遇到乱码问题时,需要对以下问题进行排查:

  • 检查文本数据的产生、存储、传输过程是否出错;
  • 尝试与文本内容提供者核对双方文本编码格式是否一致。
  • 尝试猜测文本编码,这种方法不是很可靠,但值得一试。

2.3 Qt对文本编码的处理支持

Qt提供了很多关于文本编码解码的函数及类接口。如下所示:

接口 说明
QString::fromXXX()系列QString的静态函数 如QString::fromLocal8Bit,QString::fromUtf8,QString::fromLatin1等,提供了常用的文本解码接口。解码出来的结果统一为UTF-16编码格式,保存在QString缓冲区中。
QString::toXXX()系列QString的静态函数 如QString::toLocal8Bit,QString::toUtf8,QString::toLatin1等,提供了常用的文本编码接口。编码后的文本数据,保存在QByteArray缓冲区中。
QTextCodec类 提供了更强大的编码转换功能,可以通过文本编码名称获取对应的文本编解码器。可以实现各种文本编码之间的编码转换。

这里必须提一下QByteArray和QString的区别。

类型 区别
QByteArray QByteArray中的数据,仅仅是二进制数据,可以把它看作是一个内存区,仅此而已。它用于计算机底层视角下的数据存储。可以根据业务需要,确定数据格式类型后,再进行数据处理。
QString 存储文本。它用于计算机应用视角下的文本内容存储。QString可直接在界面内容显示、文本信息处理等应用层面使用。

项目中,我们通常使用QByteArray缓存获取到的数据。如果确定QByteArray中存储的数据是文本,那么下一步需要确定文本的编码格式,最后,可以使用 QString或QTextCodec提供的文本编码转换接口对其中的数据进行编码转换,最终得到QString。反过来,我们也可以将QString保存成多种文本编码格式,用于保存或传输。

3. 容易出现文本乱码的应用场景

3.1 处理含有中文的文件

当我们读写文本文件时,必须使用协商一致的文本编码。否则会导致读取的数据产生严重乱码,影响程序稳定性,甚至造成严重后果。不管读文件还是写文件,都要考虑文本编码问题。

3.2 含有中文的代码文件乱码

使用Qt+MSVC在Windows上进行开发时,经常会遇到代码编译不通过,或者程序运行出现乱码的问题。原因是MSVC默认认为源代码是GBK编码。在Qt .pro文件中打开以下编译开关,告诉MSVC编译器,使用UTF-8格式处理源码文本即可解决:

QMAKE_C_FLAGS += /utf-8
QMAKE_CXX_FLAGS += /utf-8

3.3 处理含有中文的通信数据

在进行数据通信的时候,如果通信协议中包含中文,而通信双方又没有对文本编码做出明确约定,那么很有可能会出现乱码的问题。解决办法是,通信双方通信协议中提前约定好的统一的文本编码,一般可以使用UTF-8编码。

4. 总结

牢记:只要我们按文本处理数据,就要考虑数据格式和文本编码。绝不可忽略文本编码直接进行文本处理。

除Qt开发外,在其他软件开发技术中也需要注意文本编码问题。

本文主要讲解了文本编码的相关处理经验和总体逻辑框架。文本编码相关内容很多,项目中可能会出现各种各样的问题,需要结合本文讲解的总体思路,深入问题综合分析。


本文原创发布于 Qt未来工程师。文章来源地址https://www.toymoban.com/news/detail-705357.html

到了这里,关于【Qt】总体把握文本编码问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt中QGraphicsView总体架构学习

    前段时间学习了下如何在QGraphicsView架构中绘制刻度尺,主要是与OnPainter中进行比较的,那么今天就来详细讲解下我对QGraphicsView框架的认知吧~ 最近一段时间想学习下,如果我有不正确的,欢迎留言探讨哟~ 使用过OnPainter绘制过图形的,QPainter绘制需要在绘制设备的paintEvent()事

    2024年02月02日
    浏览(37)
  • Qt应用开发(基础篇)——纯文本编辑窗口 QPlainTextEdit

             QPlainTextEdit 类继承于 QAbstractScrollArea , QAbstractScrollArea 继承于 QFrame ,是Qt用来显示和编辑纯文本的窗口。 滚屏区域基类 https://blog.csdn.net/u014491932/article/details/132245486?spm=1001.2014.3001.5501 框架类QFrame https://blog.csdn.net/u014491932/article/details/132188655?spm=1001.2014.3001.5501   

    2024年02月11日
    浏览(45)
  • 07-1_Qt 5.9 C++开发指南_文件系统及文件读写_文本文件读写(使用 QTextStream 进行文件读写更为方便)

    文本文件是指以纯文本格式存储的文件,例如用 Qt Creator 编写的 C++程序的头文件 (.h 文件)和源程序文件 (.cpp 文件)。HTML 和 XML 文件也是纯文本文件,只是其读取之后需要对内容进行解析之后再显示。 Qt 提供了两种读写纯文本文件的基本方法, 一种是用 QFile 类的 IODevice 读写

    2024年02月13日
    浏览(56)
  • qt读写文本文件

    使用QFile类进行读写,使用Open函数打开文件,打开方式有: QIODevice::NotOpen 0x0000 不打开 QIODevice::ReadOnly 0x0001 只读方式 QIODevice::WriteOnly 0x0002 只写方式,如果文件不存在则会自动创建文件 QIODevice::ReadWrite ReadOnly | WriteOnly 读写方式 QIODevice::Append 0x0004 此模式表明所有数据写入到文

    2024年02月10日
    浏览(54)
  • QT创建文本编辑窗口

     

    2024年02月16日
    浏览(37)
  • 二、Qt定时器与文本编辑器制作《QT 入门到实战》

    了解 qt 的 pixmap 了解 qt 的 label 如何显示图片 了解定时器的开启 了解定时器的关闭 了解文件如何进行读取 了解 QFileDialog 的使用 了解了一个文本编辑器的基本编写 巩固了 connect 的使用 在 Qt 中使用 Label 可以显示文本,但 Label 不止可以显示文本,还可以用于图片的显示。 首

    2024年02月02日
    浏览(46)
  • Qt音视频开发33-vlc和mpv打开后鼠标打圈圈问题的解决

    如果采用的vlc句柄模式,如果鼠标停留在句柄控件中会发现在打开后鼠标打圈圈,mpv句柄模式是在关闭后鼠标打圈圈,这两者真是一前一后,这种给人的体验其实很不友好的,播放开始后或者播放完成后鼠标指针居然变成了繁忙,但是当你将鼠标位置从句柄控件中移到外面的

    2023年04月08日
    浏览(37)
  • Qt(八)文本文件(打开、修改与保存)

    演示文本文件的打开,修改与保存。主要是熟悉相应的类代码使用。 一、UI布局 mainwindow.h mainwindow.cpp 二、效果演示

    2024年02月14日
    浏览(42)
  • Qt多线程读写大型文本文件项目

    目录 一 功能列表 二 架构设计 三 代码实现 四 软件原型效果 五 测试验证 六 项目工程打包发布 七 项目完整源码获取 显示文件路径选择框,仅展示 .txt类型文件可选; 读取文本文件,显示到桌面控件中; 读取的文件使用多线程处理,不影响显示界面正常操作; 读取过来

    2024年02月01日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包