《QTextCodec》

远方是什么样子 / 2023-08-15 / 原文

细节描述

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

Qt提供了一组QTextCodec类来帮助将非Unicode格式转换为Unicode格式

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

 

QTextCodecs可以将本地编码俄语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()函数。

在尝试转换数据块时,例如在通过网络接收数据时,必须非常小心。在这种情况下,一个多字节字符可能会被分成两个块。在最好的情况下,这可能导致丢失一个字符,在最坏的情况下,导致整个转换失败。

在这些情况下使用的方法是为编解码器创建一个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对象维护块之间的状态,因此即使在块之间分割多字节字符也能正常工作。

    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextDecoder *decoder = codec->makeDecoder();

    QString string;
    {
        QByteArray chunk;
        chunk.append(0xe4);
        chunk.append(0xb8);
        chunk.append(0xad);
        chunk.append(0xe6);
        string += decoder->toUnicode(chunk);   //
    }

    {
        QByteArray chunk;
        chunk.append(0x96);
        chunk.append(0x87);
        string += decoder->toUnicode(chunk);   //中文
    }

    delete decoder;

 

创建自己的编解码器类

Qt可以通过创建QTextCodec子类支持新的文本编码

纯虚函数向系统描述编码器,编码器根据需要在QTextStream支持的不同文本文件格式中使用,并在X11下用于特定于语言环境的字符输入和输出。
要为Qt添加对另一种编码的支持,创建QTextCodec的子类并实现下表中列出的函数。

 name()    返回编码的正式名称。如果编码在IANA字符集编码文件中列出,则该名称应该是该编码的首选MIME名称。

 aliases()    返回编码的备选名称列表。QTextCodec提供了一个返回空列表的默认实现。例如,“ISO-8859-1”有“latin1”、“CP819”、“IBM819”和“iso-ir-100”作为别名。

mibEnum()    如果编码列在IANA字符集编码文件中,则返回对应的MIB枚举。

convertToUnicode()  将8位字符串转换为Unicode。

convertFromUnicode()  将Unicode字符串转换为8位字符串

See also QTextStream, QTextDecoder, QTextEncoder, and Text Codecs Example.

 

 

成员类型文档

enum QTextCodec::ConversionFlag
flags QTextCodec::ConversionFlags

QTextCodec::DefaultConversion    0    没有设置标志。

QTextCodec::ConvertInvalidToNull   0x80000000    如果设置了此标志,则每个无效的输入字符将作为空字符输出。

QTextCodec::IgnoreHeader      0x1      忽略任何Unicode字节顺序标记,并且不生成任何。

ConversionFlags类型是QFlags<ConversionFlag>的类型定义。它存储ConversionFlag值的OR组合。

 

 

成员函数文档

[protected] QTextCodec::QTextCodec()

构造一个QTextCodec,并赋予它最高的优先级。QTextCodec应该总是在堆上构造(即使用new)。Qt拥有所有权,并将在应用程序终止时删除它。

 

[virtual protected] QTextCodec::~QTextCodec()

破坏QTextCodec。请注意,您不应该自己删除编解码器:一旦创建,它们就成为Qt的责任。

警告:此函数不可重入。

 

 [virtual] QList<QByteArray> QTextCodec::aliases() const

子类可以为所讨论的编解码器返回许多别名。

编解码器的标准别名可以在IANA字符集编码文件中找到。

 

[static] QList<QByteArray> QTextCodec::availableCodecs()

按名称返回所有可用编解码器的列表。调用QTextCodec::codecForName()获取名称的QTextCodec。

如果编解码器有别名,该列表可能包含对同一编解码器的多次提及。

注意:这个函数是线程安全的。

 

[static] QList<int> QTextCodec::availableMibs()

返回所有可用编解码器的mib列表。调用QTextCodec::codecForMib()获取MIB对应的QTextCodec。

 用于获取可用的字符编码标识符(MIB)。MIB 是一种用于标识字符编码的整数值。

注意:这个函数是线程安全的。

 

bool QTextCodec::canEncode(QChar ch) const

如果Unicode字符ch可以用此编解码器完全编码,则返回true;否则返回false。

#include <QTextCodec>
#include <QDebug>

int main() {
    QTextCodec* codec = QTextCodec::codecForName("UTF-8");  // 获取 UTF-8 编码的 QTextCodec 对象

    QChar ch = QChar('A');  // 要检查的 Unicode 字符

    bool canEncode = codec->canEncode(ch);

    qDebug() << "Can encode character 'A' in UTF-8? " << canEncode;

    return 0;
}

检查该字符是否可以被 UTF-8 编码。

根据当前使用的 UTF-8 编码,字符 'A' 可以被编码为 UTF-8,因此输出结果将为 "Can encode character 'A' in UTF-8? true"。

 

bool QTextCodec::canEncode(const QString &s) const

如果Unicode字符串s可以用此编解码器完全编码,则返回true;否则返回false。

 

bool QTextCodec::canEncode(QStringView s) const

 

[static] QTextCodec *QTextCodec::codecForHtml(const QByteArray &ba, QTextCodec *defaultCodec)

通过检查BOM(字节顺序标记)和内容类型元报头,尝试检测给定字节数组ba中提供的HTML片段的编码,并返回一个能够将HTML解码为unicode的QTextCodec实例。如果无法从提供的内容中检测到编解码器,则返回defaultCodec。

#include <QTextCodec>
#include <QDebug>

int main() {
    QByteArray html = "<html><head><title>My HTML</title></head><body><h1>Hello World!</h1></body></html>";

    QTextCodec* codec = QTextCodec::codecForHtml(html);

    qDebug() << "Default codec for HTML: " << codec->name();

    return 0;
}

 

[static] QTextCodec *QTextCodec::codecForHtml(const QByteArray &ba)

 

[static] QTextCodec *QTextCodec::codecForLocale()