From d059d016a6b6fb3a28d5189acbe037e336638211 Mon Sep 17 00:00:00 2001 From: wangxiaoshuang <825034831@qq.com> Date: Mon, 19 Jan 2026 17:51:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=96=87=E4=BB=B6=E4=B8=AD?= =?UTF-8?q?=E6=96=87=E4=B9=B1=E7=A0=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/zip-stream.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/utils/zip-stream.js b/src/utils/zip-stream.js index 4c3066b2..c63c1250 100644 --- a/src/utils/zip-stream.js +++ b/src/utils/zip-stream.js @@ -61,7 +61,7 @@ function concatUint8(chunks, total) { function createWriter(underlyingSource) { const files = Object.create(null) const filenames = [] - const encoder = new TextEncoder() + const encoder = new TextEncoder() // 保持UTF-8编码 let offset = 0 // bytes written to output so far let activeZipIndex = 0 @@ -141,7 +141,7 @@ function createWriter(underlyingSource) { if (fileLike.directory && !name.endsWith('/')) name += '/' if (files[name]) throw new Error('File already exists.') - const nameBuf = encoder.encode(name) + const nameBuf = encoder.encode(name) // 保持UTF-8编码 const commentBuf = encoder.encode(fileLike.comment || '') const { time, date } = dosDateTime(typeof fileLike.lastModified === 'undefined' ? Date.now() : fileLike.lastModified) @@ -174,15 +174,17 @@ function createWriter(underlyingSource) { writeLocalHeader() { this.offset = offset - const generalPurposeBitFlag = 0x0008 // data descriptor present + // 关键修改:设置通用位标记,第11位(0x0800)表示文件名使用UTF-8编码 + // 保留原0x0008(数据描述符存在),新增0x0800(UTF-8编码) + const generalPurposeBitFlag = 0x0808 const compressionMethod = 0 // store - const versionNeeded = 20 // 2.0 (ZIP64 switches this to 45) + const versionNeeded = this.needsZip64() ? 45 : 20 // 适配ZIP64 // We always use data descriptor; write zeros for crc/sizes in local header const local = getDataHelper(30 + this.nameBuf.length) u32(local.view, 0, ZIP_SIGNATURE_LOCAL) u16(local.view, 4, versionNeeded) - u16(local.view, 6, generalPurposeBitFlag) + u16(local.view, 6, generalPurposeBitFlag) // 应用UTF-8标记 u16(local.view, 8, compressionMethod) u16(local.view, 10, this.time) u16(local.view, 12, this.date) @@ -250,7 +252,8 @@ function createWriter(underlyingSource) { const versionMadeBy = useZip64 ? 45 : 20 const versionNeeded = useZip64 ? 45 : 20 - const generalPurposeBitFlag = 0x0008 + // 关键修改:中央目录也需要设置UTF-8标记 + const generalPurposeBitFlag = 0x0808 const compressionMethod = 0 const crc = file.crc ? file.crc.get() >>> 0 : 0 @@ -277,7 +280,7 @@ function createWriter(underlyingSource) { u32(cd.view, 0, ZIP_SIGNATURE_CENTRAL) u16(cd.view, 4, versionMadeBy) u16(cd.view, 6, versionNeeded) - u16(cd.view, 8, generalPurposeBitFlag) + u16(cd.view, 8, generalPurposeBitFlag) // 中央目录应用UTF-8标记 u16(cd.view, 10, compressionMethod) u16(cd.view, 12, file.time) u16(cd.view, 14, file.date) @@ -376,4 +379,4 @@ function createWriter(underlyingSource) { }) } -window.ZIP = createWriter +window.ZIP = createWriter \ No newline at end of file