QTextCodec Class
QTextCodec 类提供了文本编码之间的转换功能。更多内容...
| 头文件: | #include <QTextCodec> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core5Compat) target_link_libraries(mytarget PRIVATE Qt6::Core5Compat) |
| qmake: | QT += core5compat |
注意:该类中的所有函数均为可重入函数。
- setCodecForLocale(QTextCodec *c)
- ~QTextCodec()
注意:这些函数也是线程安全的:
- codecForName(const QByteArray &name)
- codecForMib(int mib)
- availableCodecs()
- availableMibs()
- codecForLocale()
公共函数
| 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 之间进行转换。您也可以创建自己的编码器类。
支持的编码包括:
- 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 支持的大多数编解码器。
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);当尝试分块转换数据时(例如通过网络接收数据),必须格外小心。在这种情况下,一个多字节字符可能会被拆分为两个数据块。最好的情况是导致一个字符丢失,最坏的情况则会导致整个转换失败。
在这种情况下,应为编解码器创建一个 `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 。
注意:如果 输入大小超过INT_MAX ,该函数不会进行任何检查,并返回false 。
这是一个重载函数。
bool QTextCodec::canEncode(const QString &s) const
s 包含待测试的字符串,用于检查其是否可编码。
注意:如果 输入大小超过INT_MAX ,该函数不会进行任何检查,并返回false 。
这是一个重载函数。
[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-1 格式的QTextCodec 对象。
这是一个重载函数。
[static] QTextCodec *QTextCodec::codecForLocale()
返回指向最适合此区域设置的编解码器的指针。
如果正在使用 ICU 后端,则从 ICU 中获取该编解码器;否则,可能通过操作系统特定的 API 获取。在后一种情况下,该编解码器的名称可能是“System”。
注意:此函数是线程安全的。
另请参阅 setCodecForLocale()。
[static] QTextCodec *QTextCodec::codecForMib(int mib)
返回与MIBenum mib 匹配的QTextCodec 。
注意:此函数是线程安全的。
[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 小端序
- 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()。
[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 中。
注意:如果 输入超过 `INT_MAX`,该函数不会执行任何转换,并返回一个空的 `QByteArray`。对于更长的输入,请在调用方实现分块处理,使用接受 `ConverterState` 的重载版本。
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 中。
注意:如果 输入超出INT_MAX ,该函数不会执行任何转换,并返回一个空的QByteArray 。对于更长的输入,请在调用方实现分块处理,使用接受ConverterState参数的重载函数。
这是一个重载函数。
QTextDecoder *QTextCodec::makeDecoder(int flags = DefaultConversion) const
创建一个QTextDecoder 对象,并指定flags ,用于解码char * 格式的数据块,从而生成Unicode数据块。
调用方负责删除返回的对象。
QTextEncoder *QTextCodec::makeEncoder(int flags = DefaultConversion) const
创建一个QTextEncoder ,其flags 参数指定为将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()返回。如果c 的值为nullptr ,则编解码器将重置为默认值。
对于某些希望使用自身机制设置区域设置的应用程序,这可能是有必要的。
警告:此函数不具备可重入性。
另请参阅 codecForLocale()。
QString QTextCodec::toUnicode(const QByteArray &a) const
将a 从该编解码器的编码转换为Unicode,并将结果返回至QString 中。
注意:如果 输入超出INT_MAX ,该函数不会执行任何转换,并返回一个空的QString 。对于更长的输入,请在调用方实现分块处理,使用接受ConverterState参数的重载版本。
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 包含源字符。
注意:如果 输入长度超过INT_MAX ,该函数不会执行任何转换,并返回一个空的QString 。对于更长的输入,请在调用方实现分块处理,使用接受ConverterState参数的重载版本。
这是一个重载函数。
© 2026 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.