👉一、报错来源
Unity版本:Unity 2021 3.11f1c2。
ICSharpCode.SharpZipLib.dll版本:0.86.0.518 ,Targets .NET 4.x
发布平台:WebGL
发布成功后运行WebGL,在解压zip格式文件时出现错误(编辑器运行正常解压无报错!)
👉二、报错信息
- NotSupportedException: Encoding 936 data could not be found. Make sure you have correct international codeset assembly installed and enabled.
大概意思就是:无法找到编码936的数据。确保安装并启用了正确的国际代码程序集。
👉三、定位错误及分析原因
通过Debug输出信息,确定了错误发生在解压文件实例化ZipFile对象的时候。一般发生这个错误的原因
是:1、压缩文件中有中文字符;2、项目中没有添加国际代码程序集,也就是没有添加这些dll文件(I18N.CJK、I18N、I18N.Other、I18N.MidEast、I18N.Rare、I18N.West)。
按理来说,编辑器运行无报错,发布后运行报这个错只要添加了这些dll文件应该就可以解决了,但是WebGL平台是个例外,我猜想是不是因为平台不支持动态库的的原因,导致这些dll并没有被打包进去。
于是,我就单单只给这些插件选择WebGL平台发布,发现报错无法发布成功;我又去Unity的安装路径下去找不同平台不同版本的dll导入尝试发布,还是报编码936数据的错,但是我发现D:\Program Files\Unity\Other\2021.3.11f1c2\Editor\Data\MonoBleedingEdge\lib\mono\unity_web这个文件夹下,居然没有这些国际代码程序集的版本库,我觉得我的猜想应该是成立的,
👉四、解决方法
以下方法仅建议在使用ICSharpCode.SharpZipLib插件解压时发布到WebGL平台使用,其他平台只需要导入上文提到的I18N等程序集即可
- 压缩文件中不要使用中文字符
如果项目中没有硬性要求说必须使用中文,那就不要使用中文字符,全改为英文字符。那解压就不会报错了。 - 有中文路径时可修改解压时的默认编码
实践中发现可以修改解压时的默认编码避免报错,ICSharpCode.SharpZipLib.Zip这个命名空间下有个类ZipConstants的属性DefaultCodePage是表示默认编码页的。
它默认是936编码,也就是GBK编码。
可以将其改为UTF8或ASCII编码,使用其中一个就行。
ICSharpCode.SharpZipLib.Zip.ZipConstants.DefaultCodePage = System.Text.Encoding.UTF8.CodePage;
//ICSharpCode.SharpZipLib.Zip.ZipConstants.DefaultCodePage = System.Text.Encoding.ASCII.CodePage;
但是这样这样会导致另一个问题:出现中文乱码,也就是说虽然能正常解压了,但是如果使用中文字符的话会出现乱码。如果乱码不影响你使用这个压缩文件(项目中不使用该中文名做其他用途),那可以考虑使用这个方法。
- 使用Bandizip这款软件压缩带有中文字符的文件
如果项目中必须中文字符的话,这个方法应该是最佳选择。这个问题也是困扰了我好多天,想来想去也是这个压缩时编码的问题。我原先使用的是Windows自带的WinRAR,压缩时不能选择中文字符的编码,虽然压缩完成后可以修改压缩包的编码,但是好像不起作用。后来我就找到了Bandizip这个软件压缩,可以修改压缩时的中文字符编码,压缩带有中文字符的文件在WebGL平台上能正常解压出来使用,不乱码。就非常nice !
(需要注意的是,压缩文件前勾选一下与UTF-8相关的设置)
这个软件可以去Bandizip官网上下载使用(百度搜一下就行),也可以私信找我领取安装包。
以上方法结论均从我项目实践经验中得出,仅供参考。