ITPub博客

首页 > Linux操作系统 > Linux操作系统 > DotNetZip解决文件名称中文字符不显示的问题

DotNetZip解决文件名称中文字符不显示的问题

原创 Linux操作系统 作者:iDotNetSpace 时间:2009-10-22 15:48:40 0 删除 编辑

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

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


<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->/////////////////////////////////替换内容
byte[] x = System.Text.Encoding.GetEncoding("GB2312").GetBytes(FileName);
Int16 filenameLength 
= (Int16)x.Length;
////////////////////////////////被替换内容
// filename length (Int16)
//Int16 filenameLength = (Int16)FileName.Length;
////////////////////////////////
FileName.Length不论遇到一个汉字还是一个字母数字,都是返回1,而一个汉字却占两个字节,可能问题出在这儿,再进一步地跟踪,果然发现问题

 


<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> 1/////////////////////////替换内容
 2for (j = 0; (j < x.Length) && (i + j < bytes.Length); j++)
 3{
 4    bytes[i + j] = x[j];
 5    if (_Debug) System.Console.Write(" {0:X2}", bytes[i + j]);
 6}

 7if (_Debug) System.Console.WriteLine();
 8
 9////////////////////////被替换内容
10
11//for (j = 0; (j < c.Length) && (i + j < bytes.Length); j++)
12//{
13//    bytes[i + j] = System.BitConverter.GetBytes(c[j])[0];
14//    if (_Debug) System.Console.Write(" {0:X2}", bytes[i + j]);
15//}
16//if (_Debug) System.Console.WriteLine();
17////////////////////////

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

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


<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> 1/////////////////////////替换内容
 2string str2 = System.Text.Encoding.GetEncoding("GB2312").GetString(buf, start, maxlength);
 3return str2;
 4
 5////////////////////////被替换内容
 6//int i;
 7//char[] c = new char[maxlength];
 8//for (i = 0; (i < maxlength) && (i < buf.Length) && (buf[i] != 0); i++)
 9//{
10//    c[i] = (char)buf[i]; // System.BitConverter.ToChar(buf, start+i*2);
11//}
12//string s = new System.String(c, 0, i);
13//return s;
14//////////////////////// 

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


原文地址:http://www.cnblogs.com/redleaf1995/archive/2009/10/22/1587908.html

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12639172/viewspace-617182/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: ref和out区别
请登录后发表评论 登录
全部评论

注册时间:2008-01-04

  • 博文量
    2376
  • 访问量
    5766208