You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity2018.1 WebGL使用ICSharpCode.SharpZipLib时CommitUpdate报错

解决Unity2018+WebGL下SharpZipLib编码437缺失导致的压缩失败问题

这个问题我之前踩过坑!核心原因是WebGL的IL2CPP编译环境默认只包含UTF-8等基础编码集,而SharpZipLib默认使用的Code Page 437(DOS Latin-US编码)在WebGL构建包中没有对应的实现,所以执行zip.CommitUpdate()时会抛出NotSupportedException。

下面是几个靠谱的解决办法,按优先级推荐:

1. 强制SharpZipLib使用UTF-8编码(最简便高效)

直接把SharpZipLib的默认编码替换成WebGL原生支持的UTF-8,就能绕过编码缺失的问题。修改你的压缩代码:

  • 如果你用ZipOutputStream:
    // 原来的默认编码代码(会用437)
    // var zipStream = new ZipOutputStream(File.Create(zipPath));
    // 修改为指定UTF-8编码
    var zipStream = new ZipOutputStream(File.Create(zipPath), Encoding.UTF8);
    
  • 如果你用ZipFile类:
    // 在创建ZipFile实例前设置全局默认编码
    ZipFile.DefaultEncoding = Encoding.UTF8;
    var zipFile = ZipFile.Create(zipPath);
    

修改后,压缩包的文件名会用UTF-8编码存储,WebGL环境能正常识别,编辑器端也完全兼容,不会有任何副作用。

2. 检查文件名与文件写入逻辑

虽然你已经确认文件存在,但还是要注意两个细节:

  • 避免文件名包含DOS编码437不支持的特殊字符,尽量用UTF-8兼容的字符命名文件
  • 写入压缩包时,优先用File.ReadAllBytes读取文件内容再写入,避免流操作中隐含的编码问题:
    var fileBytes = File.ReadAllBytes(filePath);
    var entry = new ZipEntry(Path.GetFileName(filePath)) { Size = fileBytes.Length };
    zipStream.PutNextEntry(entry);
    zipStream.Write(fileBytes, 0, fileBytes.Length);
    zipStream.CloseEntry();
    

3. 备选:手动添加编码支持(不推荐,会增大包体)

如果你的业务必须依赖Code Page 437(比如要兼容旧系统的压缩包格式),可以尝试以下操作,但要注意包体膨胀的问题:

  • 找到Unity安装目录下的System.Text.Encoding.CodePages.dll(一般在Editor\Data\MonoBleedingEdge\lib\mono\4.6路径下),复制到项目的Assets/Plugins文件夹
  • 在PlayerSettings中,把Managed Stripping Level设为Low或者Disabled(防止IL2CPP裁剪掉编码相关的底层代码)
    这个方法兼容性不确定,且会显著增加WebGL包体大小,所以优先推荐第一种方案。

最后提醒:修改代码后一定要重新构建WebGL并测试,确保压缩包能正常生成且内容完整。

内容的提问来源于stack exchange,提问作者dome12b

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:28:23