QTextCodec Class

QTextCodec 类提供文本编码之间的转换。更多

头文件: #include <QTextCodec>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core5Compat)
target_link_libraries(mytarget PRIVATE Qt6::Core5Compat)
qmake: QT += core5compat

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

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

公共函数

virtual QList<QByteArray> aliases() const
bool canEncode(QChar ch) const
bool canEncode(QStringView s) const
bool canEncode(const QString &s) const
QByteArray fromUnicode(const QString &str) const
QByteArray fromUnicode(const QChar *input, int number, int *state = nullptr) const
QByteArray fromUnicode(QStringView str) const
QTextDecoder *makeDecoder(int flags = DefaultConversion) const
QTextEncoder *makeEncoder(int flags = DefaultConversion) const
virtual int mibEnum() const = 0
virtual QByteArray name() const = 0
QString toUnicode(const QByteArray &a) const
QString toUnicode(const char *input, int size, int *state = nullptr) const
QString toUnicode(const char *chars) 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)
void setCodecForLocale(QTextCodec *c)

保护函数

QTextCodec()
virtual ~QTextCodec()
virtual QByteArray convertFromUnicode(const QChar *input, int number, int *state) const = 0
virtual QString convertToUnicode(const char *chars, int len, int *state) const = 0

详细说明

Qt 使用 Unicode 来存储、绘制和处理字符串。在许多情况下,您可能希望处理使用不同编码的数据。例如,大多数日语文档仍以 Shift-JIS 或 ISO 2022-JP 格式存储,而俄语用户的文档则通常以 KOI8-R 或 Windows-1251 格式存储。

Qt 提供了一组 QTextCodec 类,可帮助将非 Unicode 格式转换为 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 至 10
  • ISO 8859-13 至 16
  • Iscii-Bng, Dev, Gjr, Knd, Mlm, Ori, Pnj, Tlg 和 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 至 1258

如果 Qt 在编译时启用了 ICU 支持,应用程序也可以使用 ICU 支持的大多数编解码器。

QTextCodec可以使用 s 将本地编码的字符串转换为 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);

在尝试分块转换数据时,例如通过网络接收数据时,必须注意一些事项。在这种情况下,一个多字节字符有可能被分成两块。轻则丢失一个字符,重则导致整个转换失败。

在这种情况下使用的方法是为编解码器创建一个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 位字符串。

另请参阅 QTextStream,QTextDecoder, 和QTextEncoder

成员函数文档

[protected] QTextCodec::QTextCodec()

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

[virtual noexcept protected] QTextCodec::~QTextCodec()

销毁QTextCodec 。请注意,您不应自行删除编解码器:一旦创建,它们将成为 Qt 的责任。

警告:此函数不可重入

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

子类可以返回相关编解码器的若干别名。

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

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

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

如果编解码器有别名,则列表中可能包含多个相同编解码器的别名。

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

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

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

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

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

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

bool QTextCodec::canEncode(QChar ch) const

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

bool QTextCodec::canEncode(QStringView s) const

这是一个重载函数。

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

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

这是一个重载函数。

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

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

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

另请参阅 codecForUtfText() 。

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

这是一个重载函数。

通过检查 BOM(字节序号)和 content-type 元标头,尝试检测给定字节数组ba 中提供的 HTML 代码段的编码,并返回一个能将 html 解码为 unicode 的QTextCodec 实例。如果无法检测到编解码器,重载将返回一个 Latin-1QTextCodec

[static] QTextCodec *QTextCodec::codecForLocale()

返回最适合此本地的编解码器指针。

如果使用的是 ICU 后端,编解码器将从 ICU 获取,否则可能从操作系统特定的 API 获取。在后一种情况下,编解码器的名称可能是 "System"。

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

另请参见 setCodecForLocale()。

[static] QTextCodec *QTextCodec::codecForMib(int mib)

返回与MIBenum 匹配的QTextCodec mib

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

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

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

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

[static] QTextCodec *QTextCodec::codecForName(const char *name)

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

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

尝试使用 BOM(字节序号)检测所提供片段ba 的编码,并返回一个能将文本解码为 unicode 的QTextCodec 实例。该函数可检测以下编码之一:

  • UTF-32 Little Endian
  • UTF-32 Big Endian
  • UTF-16 小端码
  • UTF-16 Big Endian
  • UTF-8

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

另请参阅 codecForHtml().

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

这是一个重载函数。

尝试使用 BOM(字节序号)检测所提供片段ba 的编码,并返回一个能将文本解码为 unicode 的QTextCodec 实例。该函数可检测以下编码之一:

  • UTF-32 Little Endian
  • UTF-32 Big Endian
  • UTF-16 小端码
  • UTF-16 Big Endian
  • UTF-8

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

另请参阅 codecForHtml() 。

[pure virtual protected] QByteArray QTextCodec::convertFromUnicode(const QChar *input, int number, int *state) const

QTextCodec 子类必须重新实现该函数。

input 数组中的第一个number 字符从 Unicode 转换为子类的编码,并以QByteArray 返回结果。

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

[pure virtual protected] QString QTextCodec::convertToUnicode(const char *chars, int len, int *state) const

QTextCodec 子类必须重新实现该函数。

chars 的第一个len 字符从子类的编码转换为 Unicode,并将结果返回QString

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

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

str 从 Unicode 转换为该编解码器的编码,并以QByteArray 返回转换结果。

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

input 数组中的第一个number 字符从 Unicode 转换为该编码解码器的编码,并以QByteArray 返回转换结果。

所用转换器的state 会被更新。

QByteArray QTextCodec::fromUnicode(QStringView str) const

这是一个重载函数。

str 从 Unicode 转换为该编解码器的编码,并以QByteArray 返回结果。

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

用指定的flags 创建QTextDecoder ,对char * 数据块进行解码,以创建 Unicode 数据块。

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

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

用指定的flags 创建QTextEncoder ,将 Unicode 数据块编码为char * 数据。

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

[pure virtual] int QTextCodec::mibEnum() const

QTextCodec 的子类必须重新实现该函数。它返回 MIBenum(更多信息请参见IANA 字符集编码文件)。每个QTextCodec 子类都必须为该函数返回正确的唯一值。

[pure virtual] QByteArray QTextCodec::name() const

QTextCodec 子类必须重新实现该函数。它返回子类支持的编码名称。

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

[static] void QTextCodec::setCodecForLocale(QTextCodec *c)

将编解码器设置为c ;这将由codecForLocale() 返回。如果cnullptr ,编解码器将重置为默认值。

某些应用程序可能需要使用自己的机制来设置本地语言。

警告:此函数不可重入

另请参阅 codecForLocale() 。

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

a 从该编解码器的编码转换为 Unicode,并以QString 返回结果。

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

input 中的第一个size 字符从该编解码器的编码转换为 Unicode,并以QString 返回结果。

所用转换器的state 会被更新。

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

这是一个重载函数。

chars 包含源字符。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.