Qt扫盲-QTextCodec理论总结

2023-10-24 02:30

本文主要是介绍Qt扫盲-QTextCodec理论总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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位字符串。

这篇关于Qt扫盲-QTextCodec理论总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/272102

相关文章

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

Qt之QMessageBox的具体使用

《Qt之QMessageBox的具体使用》本文介绍Qt中QMessageBox类的使用,用于弹出提示、警告、错误等模态对话框,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.简单介绍3.常见函数4.按钮类型(QMessage::StandardButton)5.分步骤实现弹窗6.总结1.引言

Qt中Qfile类的使用

《Qt中Qfile类的使用》很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件,本文主要介绍了Qt中Qfile类的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.QFile文件操作3.演示示例3.1实验一3.2实验二【演示 QFile 读写二进制文件的过程】4.

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类