一、描述
Qt 使用 Unicode 来存储、绘制、操作字符串。 在许多情况下,可能希望处理使用不同编码的数据。
Qt 提供了 QTextCodec 类来帮助在非 Unicode 格式和 Unicode 之间进行转换。
QTextCodecs 可以用于将一些本地编码的字符串转换为 Unicode:
QByteArray encodedString = "...";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QString string = codec->toUnicode(encodedString);
将字符串从 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 对象维护块之间的状态,因此即使多字节字符在块之间拆分也能正常工作。
二、类型成员
1、enum QTextCodec::ConversionFlag:转换标志。
- DefaultConversion:未设置标志。
- ConvertInvalidToNull:每个无效输入字符将作为空字符输出。
- IgnoreHeader:忽略任何 Unicode 字节顺序标记并且不生成任何标记。
三、成员函数
1、[static] QList<QByteArray> availableCodecs()
按名称返回所有可用编解码器的列表。
qDebug()<<QTextCodec::availableCodecs();
2、bool canEncode(QChar ch)
bool canEncode(const QString &s)
此编解码器是否完全编码 Unicode 字符 ch / 字符串s。
3、[static] QTextCodec * codecForHtml(const QByteArray &ba, QTextCodec *defaultCodec)
返回一个能够将 html 数据解码为 unicode 的 QTextCodec 实例。如果无法从提供的内容中检测到编解码器,则返回 defaultCodec。
4、[static] QTextCodec * codecForHtml(const QByteArray &ba)
重载函数。如果无法检测到编解码器,则返回一个 Latin-1 QTextCodec。
5、[static] QTextCodec * codecForLocale()
返回指向最适合当前语言环境的编解码器的指针。
6、[static] QTextCodec * codecForName(const QByteArray &name)
[static] QTextCodec * codecForName(const char *name)
搜索所有已安装的 QTextCodec 对象并返回最匹配名称的对象,匹配不区分大小写。
7、[static] QTextCodec * codecForUtfText(const QByteArray &ba, QTextCodec *defaultCodec)
尝试使用 BOM(字节顺序标记)检测提供的代码段 ba 的编码,并返回一个能够将文本解码为 unicode 的 QTextCodec 实例。如果无法从提供的内容中检测到编解码器,则返回 defaultCodec。
8、[static] QTextCodec * codecForUtfText(const QByteArray &ba)
重载函数。如果无法检测到编解码器,则返回一个 Latin-1 QTextCodec。
9、QByteArray fromUnicode(const QString &str)
将字符串从 Unicode 转换为当前编解码器的编码,并以字节数组形式返回结果。
10、QByteArray fromUnicode(const QChar *input, int n, QTextCodec::ConverterState *state = nullptr)
将input数组中n个字符从 Unicode 转换为此编解码器的编码,并在 QByteArray 中返回结果。
11、[static] void setCodecForLocale(QTextCodec *c)
设置程序的编解码器。这将由 codecForLocale() 返回。 如果 c 为 nullptr,则编解码器将重置为默认值。
12、QString toUnicode(const QByteArray &a)
QString toUnicode(const char *chars)
QString toUnicode(const char *input, int n, QTextCodec::ConverterState *state = nullptr)
转换为 Unicode,并在 QString 中返回结果。