From 4be2154a3c624cd3f74997bb7a1694e15e447f71 Mon Sep 17 00:00:00 2001 From: xiepengfei Date: Tue, 20 Jan 2026 11:21:47 +0800 Subject: [PATCH] fix: Fix Chinese password compression failure Fix Chinese password compression failure Log: Fix Chinese password compression failure --- 3rdparty/libzipplugin/libzipplugin.cpp | 13 ++++++++----- 3rdparty/libzipplugin/libzipplugin.h | 1 + src/source/mainwindow.cpp | 7 +++++-- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/3rdparty/libzipplugin/libzipplugin.cpp b/3rdparty/libzipplugin/libzipplugin.cpp index 5e586dc4..cfd5f693 100644 --- a/3rdparty/libzipplugin/libzipplugin.cpp +++ b/3rdparty/libzipplugin/libzipplugin.cpp @@ -216,7 +216,8 @@ PluginFinishType LibzipPlugin::extractFiles(const QList &files, const return PFT_Cancel; } else { setPassword(query.password()); - zip_set_default_password(archive, m_strPassword.toUtf8().constData()); + QByteArray passwordBytes = passwordUnicode(m_strPassword, 0); + zip_set_default_password(archive, passwordBytes.constData()); lastNeedPasswordIndex = i; i--; } @@ -269,7 +270,8 @@ PluginFinishType LibzipPlugin::extractFiles(const QList &files, const return PFT_Cancel; } else { setPassword(query.password()); - zip_set_default_password(archive, m_strPassword.toUtf8().constData()); + QByteArray passwordBytes = passwordUnicode(m_strPassword, 0); + zip_set_default_password(archive, passwordBytes.constData()); i--; } } else { @@ -668,12 +670,13 @@ bool LibzipPlugin::writeEntry(zip_t *archive, const QString &entry, const Compre // 设置压缩的加密算法 if (options.bEncryption && !options.strEncryptionMethod.isEmpty()) { //ReadOnlyArchiveInterface::password() int ret = 0; + QByteArray passwordBytes = passwordUnicode(options.strPassword, 0); if (QLatin1String("AES128") == options.strEncryptionMethod) { - ret = zip_file_set_encryption(archive, uindex, ZIP_EM_AES_128, options.strPassword.toUtf8().constData()); + ret = zip_file_set_encryption(archive, uindex, ZIP_EM_AES_128, passwordBytes.constData()); } else if (QLatin1String("AES192") == options.strEncryptionMethod) { - ret = zip_file_set_encryption(archive, uindex, ZIP_EM_AES_192, options.strPassword.toUtf8().constData()); + ret = zip_file_set_encryption(archive, uindex, ZIP_EM_AES_192, passwordBytes.constData()); } else if (QLatin1String("AES256") == options.strEncryptionMethod) { - ret = zip_file_set_encryption(archive, uindex, ZIP_EM_AES_256, options.strPassword.toUtf8().constData()); + ret = zip_file_set_encryption(archive, uindex, ZIP_EM_AES_256, passwordBytes.constData()); } if (ret != 0) { emit error(("Failed to set compression options for entry: %1")); diff --git a/3rdparty/libzipplugin/libzipplugin.h b/3rdparty/libzipplugin/libzipplugin.h index 12e02e02..1d063891 100644 --- a/3rdparty/libzipplugin/libzipplugin.h +++ b/3rdparty/libzipplugin/libzipplugin.h @@ -198,6 +198,7 @@ class LibzipPlugin : public ReadWriteArchiveInterface QMap m_mapRealDirValue; // 长文件真实文件统计 QSet m_setLongName; // 存储被截取之后的文件名称(包含001之类的) bool m_bLnfs = false; //文件系统是否支持长文件 + QByteArray m_passwordData; // 存储编码后的密码数据,确保在压缩过程中保持有效 }; #endif // LIBZIPPLUGIN_H diff --git a/src/source/mainwindow.cpp b/src/source/mainwindow.cpp index 6d043d21..9fd788f2 100644 --- a/src/source/mainwindow.cpp +++ b/src/source/mainwindow.cpp @@ -1269,8 +1269,11 @@ void MainWindow::slotCompress(const QVariant &val) // 判断zip格式是否使用了中文加密 bool zipPasswordIsChinese = false; if ("application/zip" == m_stCompressParameter.strMimeType) { - if (m_stCompressParameter.strPassword.contains(REG_EXP("[\\x4e00-\\x9fa5]+"))) { - zipPasswordIsChinese = true; + for (const QChar &ch : m_stCompressParameter.strPassword) { + if (ch.unicode() >= 0x4E00 && ch.unicode() <= 0x9FA5) { + zipPasswordIsChinese = true; + break; + } } }