一个讨厌的编码问题

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。

以上是关于一个讨厌的编码问题的主要内容,如果未能解决你的问题,请参考以下文章

玩转Python让人讨厌的编码问题

AVQueuePlayer 从资产跳转到另一个时令人讨厌的延迟

讨厌烦人的编码问题''

markdown 打字稿...编码说明,提示,作弊,指南,代码片段和教程文章

从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration

Java 之父偏爱函数式编程,反而被队友讨厌:编码风格简直像疯子!