QStringConverter Class
QStringConverter 类为文本的编码和解码提供了一个基类。更多内容...
| 头文件: | #include <QStringConverter> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| 由以下函数继承: |
- 所有成员列表(包括继承的成员)
- QStringConverter 属于字符串数据类。
注意:该类中的所有函数均为可重入函数。
公共类型
(since 6.11) struct | FinalizeResultChar |
| enum | Encoding { Utf8, Utf16, Utf16BE, Utf16LE, Utf32, …, System } |
| enum class | FinalizeResultError { NoError, InvalidCharacters, NotEnoughSpace } |
| enum class | Flag { Default, ConvertInvalidToNull, WriteBom, ConvertInitialBom, Stateless } |
| flags | Flags |
公共函数
| QStringConverter(QStringConverter &&) | |
| bool | hasError() const |
| bool | isValid() const |
| const char * | name() const |
| void | resetState() |
| QStringConverter & | operator=(QStringConverter &&) |
静态公共成员
| QStringList | availableCodecs() |
| std::optional<QStringConverter::Encoding> | encodingForData(QByteArrayView data, char16_t expectedFirstCharacter = 0) |
| std::optional<QStringConverter::Encoding> | encodingForHtml(QByteArrayView data) |
| std::optional<QStringConverter::Encoding> | encodingForName(QAnyStringView name) |
| const char * | nameForEncoding(QStringConverter::Encoding e) |
受保护函数
详细说明
Qt 使用 UTF-16 来存储、绘制和处理字符串。在许多情况下,您可能需要处理使用其他编码的数据。通过文件和网络连接传输的大多数文本数据都采用 UTF-8 编码。
QStringConverter 类是QStringEncoder 和QStringDecoder 类的基类,这些类有助于在不同的文本编码之间进行转换。QStringDecoder 可以将字符串从编码表示形式解码为 UTF-16,即 Qt 内部使用的格式。QStringEncoder 则执行相反的操作,将 UTF-16 编码的数据(通常以QString 的形式存在)编码为所需的编码。
以下编码始终受支持:
- UTF-8
- UTF-16
- UTF-16BE
- UTF-16LE
- UTF-32
- UTF-32BE
- UTF-32LE
- ISO-8859-1(拉丁-1)
- 系统编码
QStringConverter 可能根据 Qt 的编译方式支持更多编码。如果支持更多编码,可通过调用 `availableCodecs()` 列出它们。
QStringConverter可按以下方式使用该函数,将某些编码字符串与 UTF-16 之间进行转换。
假设您有一个用 UTF-8 编码的字符串,并希望将其转换为QString 。最简单的方法是像这样使用QStringDecoder :
QByteArray encodedString = "...";
auto toUtf16 = QStringDecoder(QStringDecoder::Utf8);
QString string = toUtf16(encodedString);此后,string 将包含已解码形式的文本。使用QStringEncoder 类将字符串从 Unicode 转换为本地编码同样简单:
QString string = "...";
auto fromUtf16 = QStringEncoder(QStringEncoder::Utf8);
QByteArray encodedString = fromUtf16(string);若要读写不同编码格式的文本文件,请使用 `QTextStream ` 及其 `setEncoding()` 函数。
当尝试分块转换数据时(例如通过网络接收数据),必须格外小心。在这种情况下,一个多字节字符可能会被分割成两个数据块。最好的情况是丢失一个字符,最坏的情况则是导致整个转换失败。
QStringEncoder 和QStringDecoder 通过在内部状态中进行追踪,使这一过程变得简单。因此,只需使用下一块数据再次调用编码器或解码器,系统就会自动正确地继续对数据进行编码或解码:
auto toUtf16 = QStringDecoder(QStringDecoder::Utf8);
QString string;
while (new_data_available() && !toUtf16.hasError()) {
QByteArray chunk = get_new_data();
string += toUtf16(chunk);
}
auto result = toUtf16.finalize();
if (result.error != QStringDecoder::FinalizeResult::Error::NoError) {
// Handle error
}QStringDecoder 对象会在数据块之间保持状态,因此即使多字节字符被拆分到不同的数据块中,也能正常工作。
由于其内部状态的原因,QStringConverter 对象无法被复制,但可以被移动。
另请参阅 QTextStream 、QStringDecoder 和QStringEncoder 。
成员类型文档
enum QStringConverter::Encoding
| 常数 | 值 | 描述 |
|---|---|---|
QStringConverter::Utf8 | 0 | 创建一个用于与 UTF-8 之间转换的转换器 |
QStringConverter::Utf16 | 1 | 创建一个与 UTF-16 互转的转换器。在解码时,系统会通过开头的字节顺序标记自动检测字节顺序。如果不存在该标记,或者在编码时,则默认采用系统字节顺序。 |
QStringConverter::Utf16BE | 3 | 创建一个与大端序 UTF-16 互转的转换器。 |
QStringConverter::Utf16LE | 2 | 创建一个与小端序 UTF-16 互转的转换器。 |
QStringConverter::Utf32 | 4 | 创建一个与 UTF-32 互转的转换器。在解码时,将通过开头的字节顺序标记自动检测字节顺序。如果不存在该标记,或者在编码时,则默认采用系统字节顺序。 |
QStringConverter::Utf32BE | 6 | 创建一个用于转换为或从大端序 UTF-32 的转换器。 |
QStringConverter::Utf32LE | 5 | 创建一个与小端序 UTF-32 互转的转换器。 |
QStringConverter::Latin1 | 7 | 创建一个与 ISO-8859-1(Latin1)互转的转换器。 |
QStringConverter::System | 8 | 创建一个与操作系统区域设置底层编码相互转换的转换器。对于基于 Unix 的系统,该编码始终被视为 UTF-8。在 Windows 上,该转换器用于与区域设置代码页之间进行转换。 |
enum class QStringConverter::FinalizeResultError
| 常数 | 值 | 描述 |
|---|---|---|
QStringConverter::FinalizeResultError::NoError | 0 | 无错误。 |
QStringConverter::FinalizeResultError::InvalidCharacters | 1 | 编码器已成功完成最终处理,但在最终处理过程中或稍早之前遇到了无效字符。 |
QStringConverter::FinalizeResultError::NotEnoughSpace | 2 | finalize()未成功,您必须扩大缓冲区并再次调用 finalize()。 |
enum class QStringConverter::Flag
flags QStringConverter::Flags
| 常数 | 值 | 描述 |
|---|---|---|
QStringConverter::Flag::Default | 0 | 应用默认转换规则。 |
QStringConverter::Flag::ConvertInvalidToNull | 0x2 | 如果设置了此标志,每个无效的输入字符将作为空字符输出。如果未设置此标志,则当输出编码能够表示该字符时,无效的输入字符将表示为QChar::ReplacementCharacter ;否则将表示为问号。 |
QStringConverter::Flag::WriteBom | 0x4 | 从QString 转换为输出编码时,如果输出编码支持,则将QChar::ByteOrderMark 作为第一个字符写入。UTF-8、UTF-16和UTF-32编码均支持此功能。 |
QStringConverter::Flag::ConvertInitialBom | 0x8 | 从输入编码转换为QString 时,QStringDecoder 通常会跳过开头的QChar::ByteOrderMark 。当设置此标志时,字节顺序标记将不会被跳过,而是被转换为utf-16并插入到生成的QString 的开头。 |
QStringConverter::Flag::Stateless | 0x1 | 忽略在不同函数调用之间对字符串进行编码或解码时可能出现的转换器状态。此外,如果遇到不完整的数据序列,QStringConverter 也会引发错误。 |
Flags 类型是QFlags<Flag> 的 typedef。它存储 Flag 值的按“或”运算组合。
成员函数文档
[noexcept default] QStringConverter::QStringConverter(QStringConverter &&)
通过Move构造一个QStringConverter 的实例。
[noexcept protected default] QStringConverter::~QStringConverter()
销毁QStringConverter 的实例。
[static] QStringList QStringConverter::availableCodecs()
返回一个支持的编解码器名称列表。该函数返回的名称可传递给QStringEncoder 和QStringDecoder 的构造函数,以针对给定的编解码器创建编码器或解码器。
此函数可用于获取标准编解码器之外的其他编解码器列表。要支持这些额外编解码器,需要将 Qt 编译为支持 ICU 库。
注意: 编解码器的排序 属于内部实现细节,不保证其稳定性。
[static noexcept] std::optional<QStringConverter::Encoding> QStringConverter::encodingForData(QByteArrayView data, char16_t expectedFirstCharacter = 0)
如果能够确定,则返回data 内容的编码。可以将expectedFirstCharacter 作为附加提示传递,以帮助确定编码。
如果编码不明确,则返回的可选值为空。
[static] std::optional<QStringConverter::Encoding> QStringConverter::encodingForHtml(QByteArrayView data)
尝试通过检查开头的字节顺序标记或 HTML meta 标签中的字符集指定符,来确定data 中 HTML 的编码。如果可选参数为空,则QStringConverter 不支持所指定的编码。如果未检测到任何编码,该方法将返回 Utf8。
另请参阅 QStringDecoder::decoderForHtml()。
[static noexcept] std::optional<QStringConverter::Encoding> QStringConverter::encodingForName(QAnyStringView name)
将name 转换为相应的Encoding 成员(如果存在的话)。
如果name 不是 Encoding 枚举中列出的编解码器名称,则返回std::nullopt 。不过,当 Qt 与 ICU 一起构建时,如果 ICU 提供了具有该名称的转换器,QStringConverter 的构造函数仍可能接受此类名称。
注意:在 Qt 6.8 之前的版本中,此函数仅接受一个const char * ,且该字符串预期为 UTF-8 编码。
[noexcept] bool QStringConverter::hasError() const
如果转换无法正确转换某个字符,则返回 true。例如,这可能是由于无效的 UTF-8 序列,或者由于目标编码的限制导致某个字符无法被转换而触发的。
[noexcept] bool QStringConverter::isValid() const
如果这是一个可用于文本编码或解码的有效字符串转换器,则返回 true。
通过默认构造的字符串转换器,或使用不受支持的名称构造的转换器,均视为无效。
[noexcept] const char *QStringConverter::name() const
返回该QStringConverter 能够进行编码或解码的编码规范名称。如果转换器无效,则返回 nullptr。返回的名称采用 UTF-8 编码。
另请参阅 isValid()。
[static noexcept] const char *QStringConverter::nameForEncoding(QStringConverter::Encoding e)
返回编码e 的规范名称;若e 为无效值,则返回nullptr 。
注意:在 Qt 6.10、6.9.1、6.8.4 或 6.5.9 之前的版本中,若使用无效参数调用此函数,会导致未定义行为。自上述 Qt 版本起,该函数改为返回 nullptr。
[noexcept] void QStringConverter::resetState()
重置转换器的内部状态,清除潜在的错误或未完成的转换。
[noexcept default] QStringConverter &QStringConverter::operator=(QStringConverter &&)
将other 通过move赋值给此QStringConverter 实例。
© 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.