一个讨厌的编码问题
Posted 平静的寄居者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个讨厌的编码问题相关的知识,希望对你有一定的参考价值。
编码问题很讨厌。昨天就碰到了一个,花了几个小时才解决。
使用DotNetZip这个库自动打包文件夹,原来的代码是:
var dir = new DirectoryInfo(@"c:\foo"); using (ZipFile zip = new ZipFile(Encoding.UTF8)) { var entry = zip.AddDirectory(dir.FullName, dir.Name); zip.Save(Path.Combine(path, dir.Name + ".zip")); }
看上去很正常,也似乎能work,成功打包,用7-zip打开,里面的中文文件夹也显示正常。
但是,如果是用7-zip手工打包的zip,在资源管理器里双击可以看到里面的文件夹。而这个用代码生成的zip,如果打包进去的是中文文件夹,双击却显示空白。这似乎不成问题,但因为我打包的都是pdg文件(某电子书格式文件,不懂的一搜便知),本来直接把zip后缀改成uvz,便可用一个叫做UnicornViewer的软件阅读,而这个用代码生成的zip,改名后却用UnicornViewer打不开,提示打开失败。
英文文件夹可以,中文文件夹不行,似乎很可能是“编码问题”。
用下面的代码查看zip的属性:
using (ZipFile zip = ZipFile.Read("foo.zip"))) { foreach (ZipEntry entry in zip) { if (entry.IsDirectory) {//这里加上断点,以便查看entry的属性 break; } } }
结果发现,用7-zip打包的文件,entry的AlternateEncoding显示为IBM437,FileName属性显示为乱码,比如“世界第一位六冠王赵国荣实战专辑”,显示为“╩└╜τ╡┌╥╗╬╗┴?╣┌═?╒╘╣·╚┘╩╡╒╜╫¿╝¡”。
查了很多资料,调试了半天,最后终于理解了,原来这是用IBM437去解码gb2312/gbk编码的字符串的结果。理解了这一点,修改代码:
var dir = new DirectoryInfo(@"c:\foo"); byte[] bytes = Encoding.GetEncoding("gb2312").GetBytes(dir.Name.ToCharArray()); string newName = Encoding.GetEncoding("IBM437").GetString(bytes); using (ZipFile zip = new ZipFile(Encoding.UTF8)) { zip.AlternateEncoding = Encoding.GetEncoding("IBM437"); var entry = zip.AddDirectory(dir.FullName, newName); zip.Save(Path.Combine(path, dir.Name + ".zip")); }
测试通过。
以前碰到的编码问题,多是将乱码转成正常显示的字符,这次却要故意生成“乱码”才能工作正常,呵呵。管他呢,反正it just works。
以上是关于一个讨厌的编码问题的主要内容,如果未能解决你的问题,请参考以下文章
AVQueuePlayer 从资产跳转到另一个时令人讨厌的延迟
markdown 打字稿...编码说明,提示,作弊,指南,代码片段和教程文章