DotNetZip解决文件名称中文字符不显示的问题
2009-10-22 11:13
330 查看
由于工作需要,从网上下载了一个压缩组件--DotNetZip,使用感觉良好,但是目录中有中文名称的文件时,就会出现问题,要么名称显示不全,要么就显示若干个问号,很是令人苦恼!!
没办法,只好自己动手解决问题啦,一步步的跟踪定位,最后找到ZipEntry类的WriterHeader方法,估计是写文件头,文件名称应当写在这里,经过调试,发现这一行:
FileName.Length不论遇到一个汉字还是一个字母数字,都是返回1,而一个汉字却占两个字节,可能问题出在这儿,再进一步地跟踪,果然发现问题:
程序大意是将文件名称转换为字符数组,再将字符数组压缩为字节数组,而一个字符中只有一个汉字,压缩完之后只有一个字节,而一个字节是无法表示汉字的,所以,我先采用GetBytes直接生成字节数组,获得字符串的真实长度[即汉字为2,字母数字为1],然后将字节数组逐个拷至目的字节数组,编译运行,中文名称果然顺利显示出来了!!!
问题好象是解决了,可是当解压时,却傻眼了,都是些乱码.不过有了上次的调试经验,不需要辛苦跟踪了,知道问题出在读Header的地方,果然在ZipEntry类中,有ReadHeader方法,设断点,调试,最后定位于Shared类中的StringFromBuffer方法:
这个方法大意是,将字节数组逐个转换为字符数组,将汉字的编码拆成两个字符,这很明显会造成乱码,既然编码采用GetBytes,那么解码也就用反的,GetString就行了,编译运行,大功告成!!
进入下载页面
博客园下载地址:http://files.cnblogs.com/redleaf1995/DotNetZip.rar
没办法,只好自己动手解决问题啦,一步步的跟踪定位,最后找到ZipEntry类的WriterHeader方法,估计是写文件头,文件名称应当写在这里,经过调试,发现这一行:
/////////////////////////////////替换内容 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,而一个汉字却占两个字节,可能问题出在这儿,再进一步地跟踪,果然发现问题:
/////////////////////////替换内容 for (j = 0; (j < x.Length) && (i + j < bytes.Length); j++) { bytes[i + j] = x[j]; if (_Debug) System.Console.Write(" {0:X2}", bytes[i + j]); } if (_Debug) System.Console.WriteLine(); ////////////////////////被替换内容 //for (j = 0; (j < c.Length) && (i + j < bytes.Length); j++) //{ // bytes[i + j] = System.BitConverter.GetBytes(c[j])[0]; // if (_Debug) System.Console.Write(" {0:X2}", bytes[i + j]); //} //if (_Debug) System.Console.WriteLine(); ////////////////////////
程序大意是将文件名称转换为字符数组,再将字符数组压缩为字节数组,而一个字符中只有一个汉字,压缩完之后只有一个字节,而一个字节是无法表示汉字的,所以,我先采用GetBytes直接生成字节数组,获得字符串的真实长度[即汉字为2,字母数字为1],然后将字节数组逐个拷至目的字节数组,编译运行,中文名称果然顺利显示出来了!!!
问题好象是解决了,可是当解压时,却傻眼了,都是些乱码.不过有了上次的调试经验,不需要辛苦跟踪了,知道问题出在读Header的地方,果然在ZipEntry类中,有ReadHeader方法,设断点,调试,最后定位于Shared类中的StringFromBuffer方法:
/////////////////////////替换内容 string str2 = System.Text.Encoding.GetEncoding("GB2312").GetString(buf, start, maxlength); return str2; ////////////////////////被替换内容 //int i; //char[] c = new char[maxlength]; //for (i = 0; (i < maxlength) && (i < buf.Length) && (buf[i] != 0); i++) //{ // c[i] = (char)buf[i]; // System.BitConverter.ToChar(buf, start+i*2); //} //string s = new System.String(c, 0, i); //return s; ////////////////////////
这个方法大意是,将字节数组逐个转换为字符数组,将汉字的编码拆成两个字符,这很明显会造成乱码,既然编码采用GetBytes,那么解码也就用反的,GetString就行了,编译运行,大功告成!!
进入下载页面
博客园下载地址:http://files.cnblogs.com/redleaf1995/DotNetZip.rar
相关文章推荐
- DotNetZip解决文件名称中文字符不显示的问题
- jasperreports和Ireport导出PDF文件中文不显示问题(最新解决方法)
- 解决Properties文件中的中文显示乱码问题
- Saltstack模块file发送中文名称文件问题解决
- fckeditor-java-core-2.5.jar上传中文文件显示问题的解决---http://blog.163.com/djm886@126/blog/static/88909942010024
- dokuwiki + dw2pdf 插件,解决导出pdf文件中文乱码(字体问题,显示小方块)
- Ubuntu下亲测解决zip 文件中中文文件名乱码的问题
- 解决IntelliJ IDEA 安装后打开文件目录对话框不能显示中文的问题
- Fedora 18 vim编辑器中文字符显示乱码问题的解决方法
- org.apache.tools.zip在Linux下压缩文件中文乱码问题解决
- 解决fgetcsv打开csv文件中文无法显示的问题。
- php 中文字符入库或显示乱码问题的解决方法
- mysql导入导出数据中文乱码解决方法小结(1、navicat导入问题已解决,创建连接后修改连接属性,选择高级->将使用Mysql字符集复选框去掉,下拉框选择GBK->导入sql文件OK;2、phpmyadmin显示乱码的问题也解决,两步:1.将sql文件以utf8的字符集编码另存,2.将文件中sql语句中的字段字符集编码改成utf8,导入OK)
- my.ini 文件 解决mysql无法存储中文字符问题
- iOS 文件下载 (AFNetwork 三方框架 文件名中文字符乱码问题解决)四
- Filezilla中文字符文件看不到或显示乱码的解决办法
- Qt中QFtp获取带有中文的文件名称出现乱码的解决方法(比较巧妙,toLatin1压缩掉了QString自动给每个英文字符加上的那些00字节)
- 解决eclipse资源文件名称不能含有特殊字符跟大写字母的问题
- 解决JSP引入JS文件后,JS文件中字符在页面上显示为乱码问题