详细说明
QTextCodec类提供文本编码之间的转换。
Qt使用Unicode来存储,绘制和处理字符串。 在许多情况下,您可能希望处理使用不同编码的数据。 例如,大多数日文文档仍存储在Shift-JIS或ISO 2022-JP中,而俄罗斯用户经常将其文档存储在KOI8-R或Windows-1251中。
Qt提供了一组QTextCodec类,以帮助将非Unicode格式与Unicode相互转换。 您也可以创建自己的编解码器类。
如果在启用ICU支持的情况下编译Qt,则ICU支持的大多数编解码器也将可用于该应用程序。
QTextCodecs可以按如下方式使用,以将一些本地编码的字符串转换为Unicode。假设您有一些用俄语KOI8-R编码的字符串,并且想要将其转换为Unicode。简单的方法是这样的:
QByteArray encodedString = "...";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QString string = codec->toUnicode(encodedString);
此后,字符串保存转换为Unicode的文本。将字符串从Unicode转换为本地编码非常简单:
QString string = "...";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QByteArray encodedString = codec->fromUnicode(string);
要读取或写入各种编码的文件,请使用QTextStream及其setCodec()函数。有关将QTextCodec应用于文件I / O的信息,请参见编解码器示例。
尝试分块转换数据时(例如,通过网络接收数据时),必须格外小心。在这种情况下,可能会将多字节字符分成两个块。充其量这可能会导致字符丢失,最坏的情况是导致整个转换失败。
在这些情况下使用的方法是为编解码器创建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对象维护块之间的状态,因此即使在块之间拆分了多字节字符也可以正常工作。