zoukankan      html  css  js  c++  java
  • DotNetZip解决文件名称中文字符不显示的问题

         由于工作需要,从网上下载了一个压缩组件--DotNetZip,使用感觉良好,但是目录中有中文名称的文件时,就会出现问题,要么名称显示不全,要么就显示若干个问号,很是令人苦恼!!

        没办法,只好自己动手解决问题啦,一步步的跟踪定位,最后找到ZipEntry类的WriterHeader方法,估计是写文件头,文件名称应当写在这里,经过调试,发现这一行:

    Code
    FileName.Length不论遇到一个汉字还是一个字母数字,都是返回1,而一个汉字却占两个字节,可能问题出在这儿,再进一步地跟踪,果然发现问题

    Code

    程序大意是将文件名称转换为字符数组,再将字符数组压缩为字节数组,而一个字符中只有一个汉字,压缩完之后只有一个字节,而一个字节是无法表示汉字的,所以,我先采用GetBytes直接生成字节数组,获得字符串的真实长度[即汉字为2,字母数字为1],然后将字节数组逐个拷至目的字节数组,编译运行,中文名称果然顺利显示出来了!!!

     问题好象是解决了,可是当解压时,却傻眼了,都是些乱码.不过有了上次的调试经验,不需要辛苦跟踪了,知道问题出在读Header的地方,果然在ZipEntry类中,ReadHeader方法,设断点,调试,最后定位于Shared类中的StringFromBuffer方法

    Code

    这个方法大意是,将字节数组逐个转换为字符数组,将汉字的编码拆成两个字符,这很明显会造成乱码,既然编码采用GetBytes,那么解码也就用反的,GetString就行了,编译运行,大功告成!!
    源代码下载:https://files.cnblogs.com/redleaf1995/DotNetZip.rar

  • 相关阅读:
    Effective C# 原则12:选择变量初始化而不是赋值语句
    Effective C# 原则20:明辨接口实现和虚函数重载的区别(译)
    Effective C# 原则18:实现标准的处理(Dispose)模式(译)
    Effective C# 原则19:选择定义和实现接口而不是继承(译)
    Is JoyFM goes over? Nope, I believe that JoyFM will stick together with us for a long time.
    Effective C# 原则15:使用using和try/finally来做资源清理(译)
    Effective C# 第二章:.Net资源管理(翻译)
    Effective C# 原则10: 明白GetHashCode()的缺陷(译)
    Effective C# 原则8:确保0对于值类型数据是有效的(翻译)
    Effective C# 原则23:避免返回内部类对象的引用(翻译)
  • 原文地址:https://www.cnblogs.com/redleaf1995/p/1587908.html
Copyright © 2011-2022 走看看