码迷,mamicode.com
首页 > 其他好文 > 详细

一个讨厌的编码问题

时间:2020-01-01 11:52:35      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:nat   bytes   highlight   cto   sdi   otn   rect   path   combine   

编码问题很讨厌。昨天就碰到了一个,花了几个小时才解决。

使用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。

一个讨厌的编码问题

标签:nat   bytes   highlight   cto   sdi   otn   rect   path   combine   

原文地址:https://www.cnblogs.com/badnumber/p/12128273.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!