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
相关产品推荐
相关产品推荐

