《QTextCodec》
细节描述
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名称。
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。
注意:这个函数是线程安全的。
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()