quazip是用Qt封装zlib的跨平台开源解压缩库,支持windows, linux、android平台(mac平台未测试,穷的买不起mac);


官方源码地址: https://sourceforge.net/projects/quazip/


大神关于quazip使用说明:http://blog.csdn.net/liang19890820/article/details/50636181


本文内容:

1,问题场景:解压含有中文名文件的压缩包(压缩包中有以中文为文件名的文件),直接使用官方封装的JlCompress::extractDir接口进行解压;

2,问题现象:解压后带有中文文件名的文件中文字符为乱码:

3,解决方法:经过与朋友反复研究,确定问题是zlib对中文编码的支持问题,quazip在封装过程虽然对中文进行编码处理,但是压缩包内部编码处理还是有问题; so,修改方法如下:

QString QuaZip::getCurrentFileName()const
{
  QuaZip *fakeThis=(QuaZip*)this; // non-const
  fakeThis->p->zipError=UNZ_OK;
  if(p->mode!=mdUnzip) {
    qWarning("QuaZip::getCurrentFileName(): ZIP is not open in mdUnzip mode");
    return QString();
  }
  if(!isOpen()||!hasCurrentFile())
      return QString();
  QByteArray fileName(MAX_FILE_NAME_LENGTH, 0);
  if((fakeThis->p->zipError=unzGetCurrentFileInfo64(p->unzFile_f, NULL, fileName.data(), fileName.size(),
      NULL, 0, NULL, 0))!=UNZ_OK)
    return QString();
  //QString result = p->fileNameCodec->toUnicode(fileName.constData());
  //QString result = QString(fileName);
  QString result = QString::fromUtf8(fileName);

  if (result.isEmpty())
      return result;
  // Add to directory map
  p->addCurrentFileToDirectoryMap(result);
  return result;
}

官方写法:QString result =p->fileNameCodec->toUnicode(fileName.constData());

改为:QString result =QString(fileName);或者QString result =QString::fromUtf8(fileName);




Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐