Qt扫盲-QTextCodec理论总结

news2024/11/16 9:41:39

QTextCodec理论总结

  • 一、概述
  • 二、编码支持
  • 三、使用
  • 四、创建自己的编解码器类

一、概述

QTextCodec 是Qt提供的一个管理字符串编码的功能,他可以在不同编码方式中来回转换,在文件读取的时候、格式编码转换的时候用处很大。Qt使用Unicode 编码来存储、绘制和操作字符串。在许多情况下,我们可能希望处理使用不同编码的数据。例如,大多数日本文档仍然存储在Shift-JIS或ISO 2022-JP中,而俄罗斯用户的文档通常存储在KOI8-R或Windows-1251中。

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

三、使用

如果Qt是在启用ICU支持的情况下编译的,那么ICU支持的大多数编解码器也将可用于应用程序。

QTextCodecs可以使用如下方式将一些本地编码的字符串转换为Unicode。假设我们有一些用俄语KOI8-R编码编码的字符串,并希望将其转换为Unicode。这样做的简单方法是:

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

在此之后,string保存转换为Unicode的文本。将字符串从Unicode转换为本地编码也很简单:

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

要读取或写入各种编码的文件,请使用QTextStream及其setCodec()函数。最好显式的设置一下这些编码的格式。

  if (data.open(QFile::WriteOnly | QFile::Truncate)) {
      QTextStream out(&file);
  	  out.setCodec("UTF-8");
      out << "Result: " << qSetFieldWidth(10) << left << 3.14 << 2.7;
      // writes "Result: 3.14      2.7       "
  }

在尝试转换数据块时,例如在通过网络接收数据时,必须非常小心。在这种情况下,一个多字节字符可能会被分成两个块。在最好的情况下,这可能导致丢失一个字符,在最坏的情况下,导致整个转换失败。在这些情况下使用的方法是为编解码器创建一个QTextDecoder对象,并在整个解码过程中使用这个QTextDecoder,如下所示:

  QTextCodec *codec = QTextCodec::codecForName("Shift-JIS");
  QTextDecoder *decoder = codec->makeDecoder();

  QString string;
  while (new_data_available()) {
      QByteArray chunk = get_new_data();
      string += decoder->toUnicode(chunk);
  }
  delete decoder;

QTextDecoder对象维护块之间的状态,因此即使在块之间分割多字节字符也能正常工作。

四、创建自己的编解码器类

Qt可以通过创建QTextCodec子类来支持新的文本编码。
纯虚函数向系统描述编码器,编码器根据需要在QTextStream支持的不同文本文件格式中使用,并在X11下用于特定于语言环境的字符输入和输出。

要为Qt添加对另一种编码的支持,创建QTextCodec的子类并实现下表中列出的函数j即可。

函数描述
name()返回编码的正式名称。如果编码在IANA字符集编码文件中列出,则该名称应该是该编码的首选MIME名称。
aliases()返回编码的备选名称列表。QTextCodec提供了一个返回空列表的默认实现。例如,“ISO-8859-1”有“latin1”、“CP819”、“IBM819”和“iso-ir-100”作为别名。
mibEnum ()如果编码列在IANA字符集编码文件中,则返回对应的MIB枚举。
convertToUnicode ()将8位字符串转换为Unicode。
convertFromUnicode ()将Unicode字符串转换为8位字符串。

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

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

相关文章

探索未来的视觉革命:卷积神经网络的崭新时代(一)

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

【圆满落幕】IDCF社区天津理工大学华信软件学院校友会技术沙龙丨IDCF

金秋十月的校园既充满活力又不失庄重&#xff0c;既富有学术气息又不失生活情趣&#xff0c;这里是学生们求学、成长和发展的小天地&#xff0c;洋溢着青春的活力和积极向上的氛围。由IDCF社区&天津理工大学华信软件学院联合举办的校友会技术沙龙活动在这里圆满举行——让技…

Kotlin 知识点小结

一.Kotlin 协程启动方式总结 1.withContext 同步串行 带返回 2.launch 异步 不带返回 3.asyc 异步 带返回 4.runblocking 同步 带返回 二.作用域函数 &#xff0c;T的扩展函数 &#xff08;with不是T的扩展函数&#xff09;都是内联函数 Kotlin中的lateinit和by lazy有以下…

短视频矩阵系统源码---php搭建

一、智能剪辑、矩阵分发、无人直播、爆款文案于一体独立应用开发 抖去推----主要针对本地生活的----移动端(小程序软件系统&#xff0c;目前是全国源头独立开发)&#xff0c;开发功能大拆解分享&#xff0c;功能大拆解&#xff1a; &#xff08;1&#xff09;数据概览&#x…

【LeetCode力扣】86. 分隔链表

目录 1、题目介绍 2、解题思路 2.1、双链表双指针 2.2、代码描述 1、题目介绍 原题链接&#xff1a;86. 分隔链表 - 力扣&#xff08;LeetCode&#xff09; 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x 3 输出&#xff1a;[1,2,2,4,3,5] 示例 2&#xff…

2048天创作纪念日

2048天创作纪念日 初心收获日常成就憧憬 初心 大一的时候&#xff0c;老师上课说可以通过浏览他人博客或者自己写博客来学习编程。从那以后&#xff0c;写博客这件事情就埋在了我心里&#xff0c;但是我一直没有什么内容想写。直到入选了ACM校队后&#xff0c;需要经常做大量的…

【算法|动态规划No.24】leetcode LCR 093. 最长的斐波那契子序列的长度

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

wireshark抓包解密TLS,解决个人环境看不到明文流量

wireshark抓包浏览器流量 https://monkeywie.cn/2020/08/07/wireshark-capture-https/ 解密TLS流量 按照上面的步骤抓到流量后&#xff0c;正常是可以看到明文数据&#xff0c;但在我的wireshark上一直看不到。因为有其它替代方案&#xff08;在反向代理后面抓包、fiddler&a…

2023下半年信息系统集成设计师选择题

选择题 第一章 信息基础知识第二章 信息系统集成第三章 专业技能知识第四章 项目管理一般知识第五章 项目立项管理第六章 项目整体管理第七章 项目范围管理第八章 项目进度管理第九章 项目成本管理第十章 项目质量管理第十一章 项目管理干系人第十三章 合同管理第十五章 配置管…

springBoot整合讯飞星火认知大模型

1.概述 讯飞星火大模型是科大讯飞最近开放的拥有跨领域的知识和语言理解能力的大模型&#xff0c;能够完成问答对话和文学创作等。由于讯飞星火大模型最近可以免费试用&#xff0c;开发者都可以免费申请一个QPS不超过2的账号&#xff0c;用来实现对平台能力的验证。本文将利用…

好物周刊#27:音乐助手

https://github.com/cunyu1943/JavaPark https://yuque.com/cunyu1943 村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. lamp 快速开发平台 lamp-cloud 基于 Jdk11 SpringCloud SpringBoot …

【LeetCode】101. 对称二叉树

101. 对称二叉树&#xff08;简单&#xff09; 方法&#xff1a;递归 思路 两个树互为镜像的条件&#xff1a; 它们的两个根结点具有相同的值。每个树的右子树都与另一个树的左子树镜像对称。 因此&#xff0c;我们需要递归比较左子树和右子树&#xff0c;将根节点的左子树记…

线程池在项目中的使用

1.runAsync执行完后无返回值 package com.search.thread; import java.util.concurrent.*; public class ThreadTest {public static ExecutorService executor Executors.newFixedThreadPool(10);public static void main(String[] args) throws ExecutionException, Interr…

极米投影仪怎么样?轻薄投影极米Z7X值得选择吗?

对于当代快节奏的打工人而言&#xff0c;我们有时候很需要一些独特的方式来逃离日常生活的疲惫&#xff0c;拥有一个自己的空间&#xff0c;享受一个人的独处时光。要想享受居家独处好时光&#xff0c;当然少不了家居娱乐好伙伴极米Z7X。无论你是想要看一场科幻大片&#xff0c…

gin框架39--重构 BasicAuth 中间件

gin框架39--重构 BasicAuth 中间件 介绍gin BasicAuth 解析自定义newAuth实现基础认证注意事项说明 介绍 每当我们打开一个网址的时候&#xff0c;会自动弹出一个认证界面&#xff0c;要求我们输入用户名和密码&#xff0c;这种BasicAuth是最基础、最常见的认证方式&#xff0…

Godot 官方2D C#重构(2):弹幕躲避

前言 Godot 官方 教程 Godot 2d 官方案例C#重构 专栏 Godot 2d 重构 github地址 实现效果 技术点说明 异步函数 Godot的事件不能在Task中运行&#xff0c;因为会导致跨线程的问题。 //这样是不行的&#xff0c;因为跨线程了&#xff0c;而且会阻塞UI线程&#xff0c;具体原因…

高效恢复丢失的文件的10 款Android数据恢复工具

在当今快节奏的数字时代&#xff0c;从Android设备丢失重要数据可能是一场噩梦。 您需要一个可靠的恢复工具来取回您的数据&#xff0c;例如令人难忘的照片&#xff0c;重要的联系人&#xff0c;重要的工作文档等。 值得庆幸的是&#xff0c;有许多高效的Android数据恢复工具可…

2023年中国人力资源咨询发展历程及市场规模前景分析[图]

人力资源咨询是企业借助外部智力资源提高自身管理水平和效率的重要路径&#xff0c;属于管理咨询业的一个重要分支, 一方面&#xff0c;人力资源咨询要为企业提供基础的人力资源外包服务&#xff1b;另一方面&#xff0c;人力资源咨询要为企业提供专业化、职业化现代人力资源管…

《深入浅出OCR》实战:基于DBNet的文字检测

✨专栏介绍: 经过几个月的精心筹备,本作者推出全新系列《深入浅出OCR》专栏,对标最全OCR教程,具体章节如导图所示,将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。 💙个人主页: GoAI |💚 公众号: GoAI的学习小屋 | 💛交流群: 7049325…

【LeetCode】54. 螺旋矩阵

1 问题 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 示例 2&#xff1a; 输入&#xff1a;matri…