由于工作需要,从网上下载了一个压缩组件--DotNetZip,使用感觉良好,但是目录中有中文名称的文件时,就会出现问题,要么名称显示不全,要么就显示若干个问号,很是令人苦恼!!
没办法,只好自己动手解决问题啦,一步步的跟踪定位,最后找到ZipEntry类的WriterHeader方法,估计是写文件头,文件名称应当写在这里,经过调试,发现这一行:

Code

/**//////////////////////////////////替换内容
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
1
/**//////////////////////////替换内容
2
for (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
}
7
if (_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
1
/**//////////////////////////替换内容
2
string str2 = System.Text.Encoding.GetEncoding("GB2312").GetString(buf, start, maxlength);
3
return 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
posted @
2009-10-22 11:00 红色枫叶 阅读(1977) |
评论 (7) |
编辑
摘要:
在CSDN上,看到有人问这个问题。就是若把页面右键屏蔽的话,文本框上的右键菜单同样也给屏蔽,问如何能够将文本框的右键菜单显示出来。
解决思路:首先,要在页面初始化时将页面右键菜单屏蔽
其次,在欲解除右键限制的文本框获得焦点时,启用页面document的右键菜单。可以用在文本框中的onmousedown事件中,但推荐用在 onfocus事件中,若使用的onmousedown的话,则按键盘上摸拟右键的按键(在右win键右边)不响应;若用onfocus事件,则能顺利响应。
最后,当该文本框失去焦点时,需将页面document的右键菜单屏蔽,用文本框的onblur事件即可。
阅读全文
posted @
2008-04-25 11:02 红色枫叶 阅读(856) |
评论 (3) |
编辑
摘要:
在javascript中,我们经常要对日期格式加以判断,用正则表达式是最为快捷有效的,下面是验证日期格式(YYYY-MM-DD)和日期时间格式(YYYY-MM-DD hh:mm:ss)的正则表达式.
var _reDataTime = /^([1-9]\d{3}-((0?[1-9])|(1[0-2]))-((0[1-9])|([1-2]?\d)|(3[0-1])))?$/ //日期格式,可为空
var _reTimeReg = /^[1-9][0-9]{3}-(0?[1-9]|1[0|1|2])-(0?[1-9]|[1|2][0-9]|3[0|1])\s(0?[1-9]|1[0-9]|2[0-3]):(0?[0-9]|[1|2|3|4|5][0-9]):(0?[0-9]|[1|2|3|4|5][0-9])$/; //日期时间格式
下面验证某个字符 阅读全文
posted @
2008-04-24 10:06 红色枫叶 阅读(1653) |
评论 (0) |
编辑
摘要:
一个javascript写的media player播放器界面较为简单,支持播放列表 。建立播放列表的步骤为:1)在文本框中输入媒体资源的地址,可以是HTTP地址,相对地址和绝对地址2)点击“添加到媒体列表”按钮,将媒体资源信息放到媒体列表中3)在媒体列表中,点击“添加”链接,将媒体加入到播放列表中4)重复若干遍,加入所有歌曲5)点击“播放选中的歌曲“,就开始播放 播放列表中的所有打勾的媒体文件
阅读全文
posted @
2008-04-21 14:46 红色枫叶 阅读(785) |
评论 (1) |
编辑
摘要:
web开发和windows开发最大的区别就是windows开发是有状态的,而web开发是无状态的,在windows中,一切操作都可以由程序来控制 ,除非强制执行ctrl+alt+del;但web操作就不一样了,即使执行很重要的操作,用户一点击浏览器关闭按钮,就将前面操作成果化为乌有.尽管可以在onunload事件中加些代码,让用户可以选择是否退出,但不能从根本上解决问题! 前几天,从网上看到setCapture方法,了解了一下,大体是这样的意思,当在IE文档某个区域中使用了这个方法,并且写了onclick或者 onmouse***等有关的鼠标事件方法,那么它就会监视相应的鼠标操作,即使你的鼠标移出了IE,它也一样能捕获到.如果你在某div中的 onclick事件中写了一个alert命令,这时,你点击的关闭按钮,它也一样会弹出alert窗口.releaseCapture与 s 阅读全文
posted @
2008-04-18 11:25 红色枫叶 阅读(1324) |
评论 (0) |
编辑
摘要:
前面的文章探讨了使用javascript来操纵HTML元素的自定义属性,那么在HTML页面中,除了系统支持的HTML元素外,是否可以建立自定义的HTML元素呢?答案是可以的。自定义的HTML元素与系统自身的HTML元素地位相同,都可以用document.getElementById来获得,区别在于,自定义的HTML元素都是不可见的,类似于隐藏控件。使用自定义HTML元素,我们就可以建立多种隐藏控件,而不一定拘泥于只能建立input的hidden元素了;另外,还可以用于某些特定方面的需求!
阅读全文
posted @
2008-04-17 11:28 红色枫叶 阅读(391) |
评论 (3) |
编辑
摘要:
因工作需要,需使用javascript来操作HTML在线编辑器,在网上搜了许多,都是与服务器端相结合的,通过表单提交的方式来处理的。没办法,只好在此基础上对其进行更新!
参考的myeditor控件不知是哪位高人写的。在此表示感谢!
首先,定义一全局变量,用于向HtmlEditor传递值:
阅读全文
posted @
2008-04-16 11:35 红色枫叶 阅读(1603) |
评论 (1) |
编辑
摘要:
在WEB应用程序中,经常需要将数据从数据库中取出来,填充到HTML控件中,然后再存回数据库。如果数据并未改动,仍然占用网络资源存入数据库,则对网络资源是一种浪费,当页面数据很多和网络访问量很大时,就会形成性能的瓶颈。如何能在提交数据前进行判断呢?一种方法是建隐藏控件或定义全局变量,这种情况适用于控件很少时,若一个表单页面有数十项时,建隐藏控件太多反而降低性能,定义全局变量不容易记忆。另一种方法,就是在原有控件中增加自定义属性,这样,既能避免逻辑复杂,又能节省网络流量。
阅读全文
posted @
2008-04-15 11:58 红色枫叶 阅读(458) |
评论 (5) |
编辑