QTextCodec 类

The QTextCodec class provides conversions between text encodings. 更多...

头文件 #include <QTextCodec>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core5Compat)
target_link_libraries(mytarget PRIVATE Qt6::Core5Compat)
qmakeQT += core5compat

注意:该类中所有函数都可重入

注意:这些函数也是线程安全

公开类型

公开函数

virtual QList<QByteArray>aliases() const
boolcanEncode(QChar ch) const
boolcanEncode(const QString &s) const
boolcanEncode(QStringView s) const
QByteArrayfromUnicode(const QString &str) const
QByteArrayfromUnicode(QStringView str) const
QByteArrayfromUnicode(const QChar *input, int number, QTextCodec::ConverterState *state = nullptr) const
QTextDecoder *makeDecoder(QTextCodec::ConversionFlags flags = DefaultConversion) const
QTextEncoder *makeEncoder(QTextCodec::ConversionFlags flags = DefaultConversion) const
virtual intmibEnum() const = 0
virtual QByteArrayname() const = 0
QStringtoUnicode(const QByteArray &a) const
QStringtoUnicode(const char *chars) const
QStringtoUnicode(const char *input, int size, QTextCodec::ConverterState *state = nullptr) const

静态公开成员

QList<QByteArray>availableCodecs()
QList<int>availableMibs()
QTextCodec *codecForHtml(const QByteArray &ba, QTextCodec *defaultCodec)
QTextCodec *codecForHtml(const QByteArray &ba)
QTextCodec *codecForLocale()
QTextCodec *codecForMib(int mib)
QTextCodec *codecForName(const QByteArray &name)
QTextCodec *codecForName(const char *name)
QTextCodec *codecForUtfText(const QByteArray &ba, QTextCodec *defaultCodec)
QTextCodec *codecForUtfText(const QByteArray &ba)
voidsetCodecForLocale(QTextCodec *c)

受保护函数

QTextCodec()
virtual~QTextCodec()
virtual QByteArrayconvertFromUnicode(const QChar *input, int number, QTextCodec::ConverterState *state) const = 0
virtual QStringconvertToUnicode(const char *chars, int len, QTextCodec::ConverterState *state) const = 0

详细信息

Qt 使用 Unicode 用于存储、绘制和处理字符串。在许多情况下,您可能需要处理使用不同编码的数据。例如,大部分日文文档仍然存储在 Shift-JIS 或 ISO 2022-JP 中,而俄语用户通常有其文档存储在 KOI8-R 或 Windows-1251 中。

Qt 提供一系列 QTextCodec 类来帮助将非 Unicode 格式转换为 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 支持的大多数编解码器。

QTextCodec 可以如下使用,将一些本地编码的字符串转换为 Unicode。假设您有一个使用 Russian 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);

在尝试分块转换数据时(例如,在网络中接收时)必须小心,例如,分块之间可能将多字节字符分开。最好的结果可能是丢失一个字符,最坏可能导致整个转换失败。

在这种情况下应采用的做法是创建一个用于编解码器的 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 子类将新的文本编码支持添加到 Qt。

纯虚拟函数将为系统描述编码器,编码器在 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 位字符字符串。

另请参阅QTextStreamQTextDecoderQTextEncoder

成员类型文档

[别名] QTextCodec::ConversionFlags

常量描述
DefaultConversion没有设置任何标志。
ConvertInvalidToNull如果设置了此标志,则每个无效输入字符以 null 字符输出。
IgnoreHeader忽略任何 Unicode 字节顺序标记,并且不生成任何标记。

[别名] QTextCodec::ConverterState

成员函数文档

[受保护] QTextCodec::QTextCodec()

构建一个 QTextCodec,并赋予它最高的优先级。QTextCodec 应始终在堆上构建(即使用 new)。Qt 承担所有权,并在应用程序结束时删除它。

[虚拟 noexcept 受保护] QTextCodec::~QTextCodec()

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

警告: 此函数不是 可重入的

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

子类可以返回给定编解码器的多个别名。

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

[静态] QList<QByteArray> QTextCodec::availableCodecs()

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

如果编解码器有别名,列表中可能包含许多有关同一编解码器的提及。

注意: 此函数是 线程安全的

另请参阅availableMibs()、name() 和 aliases()。

[静态] QList<int> QTextCodec::availableMibs()

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

注意: 此函数是 线程安全的

另请参阅availableCodecs() 和 mibEnum()。

bool QTextCodec::canEncode(QChar ch) const

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

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

这是一个重载函数。

s 包含正在测试编码能力的字符串。

bool QTextCodec::canEncode(QStringView s) const

这是一个重载函数。

如果 Unicode 字符串 s 可以使用该编解码器完整地编码,则返回 true;否则返回 false

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

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

另请参阅codecForUtfText

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

这是一个重载函数。

通过检查 BOM(字节顺序标记)和内容类型元标题,尝试在给定的字节数组 ba 中检测提供的 HTML 片段编码,并返回一个可以解码 HTML 为 Unicode 的 QTextCodec 实例。如果无法检测到编解码器,则此重载返回一个 Latin-1 QTextCodec

[静态] QTextCodec *QTextCodec::codecForLocale()

返回最适合当前区域设置的编解码器指针。

编解码器将从 ICU 背景(如果使用该后端)检索,否则可能从 OS 特定的 API 中获取。在后一种情况下,编解码器的名称可能是“System”。

注意: 此函数是 线程安全的

另请参阅setCodecForLocale

[静态] QTextCodec *QTextCodec::codecForMib(int mib)

返回与 MIBenum mib 匹配的 QTextCodec

注意: 此函数是 线程安全的

[静态] QTextCodec *QTextCodec::codecForName(const QByteArray &name)

搜索所有安装的 QTextCodec 对象,并返回与 name 最匹配的一个;匹配不区分大小写。如果没有找到与名称 name 匹配的编解码器,则返回 nullptr

注意: 此函数是 线程安全的

[静态] QTextCodec *QTextCodec::codecForName(const char *name)

搜索所有安装的 QTextCodec 对象,并返回与 name 最匹配的一个;匹配不区分大小写。如果没有找到与名称 name 匹配的编解码器,则返回 nullptr

[静态] QTextCodec *QTextCodec::codecForUtfText(const QByteArray &ba, QTextCodec *defaultCodec)

通过使用 BOM(字节顺序标记)尝试检测提供的文本片段 ba 的编码,并返回一个可以将文本解码为 Unicode 的 QTextCodec 实例。此函数可以检测以下编解码器之一

  • UTF-32 小端
  • UTF-32 大端
  • UTF-16 小端模式
  • UTF-16 大端模式
  • UTF-8

如果无法从提供的内容中检测到编解码器,则返回 defaultCodec

另请参阅 codecForHtml

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

这是一个重载函数。

通过使用 BOM(字节顺序标记)尝试检测提供的文本片段 ba 的编码,并返回一个可以将文本解码为 Unicode 的 QTextCodec 实例。此函数可以检测以下编解码器之一

  • UTF-32 小端
  • UTF-32 大端
  • UTF-16 小端模式
  • UTF-16 大端模式
  • UTF-8

如果无法从提供的内容中检测到编解码器,此重载将返回 Latin-1 QTextCodec

另请参阅 codecForHtml

[纯虚保护] QByteArray QTextCodec::convertFromUnicode(const QChar *input, int number, QTextCodec::ConverterState *state) const

QTextCodec 的子类必须重写此函数。

将输入数组中的前 number 个字符从 Unicode 转换为子类的编码,并返回结果到一个 QByteArray

state 可以是 nullptr,在这种情况下转换是无状态的,应使用默认转换规则。如果 state 不是 nullptr,编解码器应在 state 中保存转换后的状态,并调整结构体中的 remainingCharsinvalidChars 成员。

[纯虚保护] QString QTextCodec::convertToUnicode(const char *chars, int len, QTextCodec::ConverterState *state) const

QTextCodec 的子类必须重写此函数。

chars 编码为子类的编码的前 len 个字符从子类的编码转换为 Unicode,并将结果放入一个 QString

state 可以是 nullptr,在这种情况下转换是无状态的,应使用默认转换规则。如果 state 不是 nullptr,编解码器应在 state 中保存转换后的状态,并调整结构体中的 remainingCharsinvalidChars 成员。

QByteArray QTextCodec::fromUnicode(const QString &str) const

str 从 Unicode 转换为该编解码器的编码,并返回结果到一个 QByteArray

QByteArray QTextCodec::fromUnicode(QStringView str) const

这是一个重载函数。

str 从 Unicode 转换为该编解码器的编码,并返回结果到一个 QByteArray

QByteArray QTextCodec::fromUnicode(const QChar *input, int number, QTextCodec::ConverterState *state = nullptr) const

将输入数组中的前 number 个字符从 Unicode 转换为该编解码器的编码,并返回结果到一个 QByteArray

更新了转换器的状态。

QTextDecoder *QTextCodec::makeDecoder(QTextCodec::ConversionFlags flags = DefaultConversion) const

创建一个具有指定 flagsQTextDecoder,以解码 char * 数据块,创建 Unicode 数据块。

调用者负责删除返回的对象。

QTextEncoder *QTextCodec::makeEncoder(QTextCodec::ConversionFlags flags = DefaultConversion) const

创建一个具有指定 flagsQTextEncoder,用于将 Unicode 数据块编码为 char * 数据。

调用者负责删除返回的对象。

[纯虚函数] int QTextCodec::mibEnum() const

QTextCodec 的子类必须重写此函数。返回 MIBenum(有关更多信息,请参阅IANA 字符集编码文件)。对于每个QTextCodec 子类,返回此函数的正确唯一值非常重要。

[纯虚函数] QByteArray QTextCodec::name() const

QTextCodec 子类必须重写此函数。它返回子类支持的编码名称。

如果该编码已注册为IANA 字符集编码文件中的字符集,则此方法应返回编码的首选 MIME 名称(如果定义),否则返回其名称。

[静态] void QTextCodec::setCodecForLocale(QTextCodec *c)

将编码设置为 c;这将返回codecForLocale。如果 cnullptr,则编码将重置为默认值。

这可能对于一些希望使用自己的机制设置区域设置的某些应用程序来说是必需的。

警告: 此函数不是 可重入的

另请参阅codecForLocale

QString QTextCodec::toUnicode(const QByteArray &a) const

a 从此编码的编码转换为 Unicode,并将结果返回到 QString

QString QTextCodec::toUnicode(const char *chars) const

这是一个重载函数。

chars 包含源字符。

QString QTextCodec::toUnicode(const char *input, int size, QTextCodec::ConverterState *state = nullptr) const

input 的前 size 个字符从此编码的编码转换为 Unicode,并将结果返回到 QString

更新了转换器的状态。

© 2024 Qt公司有限公司。本文件中包含的文档贡献权属于各自所有者。本提供的文档根据自由软件基金会发布的GNU自由文档许可协议的第1.3版进行许可。 Qt及其 logo 是芬兰以及全世界其他国家的Qt公司有限公司的商标。其他所有商标均为各自所有者的财产。