QT的QTextCodec类的使用

详细说明
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对象维护块之间的状态,因此即使在块之间拆分了多字节字符也可以正常工作。

上一篇:Linux qt 中文乱码输出问题的解决办法:


下一篇:Django报错UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: ill.