月度存档: 五月 2008

在JScript中使用ADODB.Stream判断文件编码

在实现TextStraem的时候,找到判断文件编码的代码是VBS的,但是在JScript中是没有ASC等函数的,也不能对二进制数据进行处理,因此需要通过一个特别的方法来获取文件开关的编码标识。

一开始使用ASCII编码来读取文本数据,模拟读取二进制数据,但是发现如果字符编码大于127时,只会得到小于128的值,相当于和128取余了,因此ASCII编码是不行的。

继续寻找,在CodeProejct.com找到一篇文章《Reading And Writing Binary Files Using JScript》,里面刚好有我需要的内容。

其实说来也简单,就是把编码换一下,使用437,这个是IBM扩展过的ASCII编码,把ASCII编码的最高位也利用起来,将字符集中的字符从128个扩展到256个,而使用这个字符集读取的字符数据就相当于原始二进制数据了。

解决了障碍后,就要开始识别文件的编码了,通过使用ADODB.Stream对象来读取文件的开始两个字节,然后根据这两个字节就可以判断文件编码是什么了。

UTF-8文件如果带BOM的话,那么头两个字节就是0xEF、0xBB,再例如Unicode文件的开始两个字节是0xFF、0xFE,这些就是判断文件编码的依据。

需要注意的是,在ADODB.Stream读取字符时,并不是一一对应的,也就是说,如果二进制数据是0xEF,读取出来的字符经过charCodeAt之后,并不是0xFE,而是另外的值,这个对应表可以在上面提到的文章里查到。

  • function CheckEncoding(filename) {
  • var stream = new ActiveXObject(“ADODB.Stream”);
  • stream.Mode = 3;
  • stream.Type = 2;
  • stream.Open();
  • stream.Charset = “437”;
  • stream.LoadFromFile(filename);
  • var bom = escape(stream.ReadText(2));
  • switch(bom) {
  • // 0xEF,0xBB => UTF-8
  • case “%u2229%u2557”:
  • encoding = “UTF-8”;
  • break;
  • // 0xFF,0xFE => Unicode
  • case “%A0%u25A0”:
  • // 0xFE,0xFF => Unicode big endian
  • case “%u25A0%A0”:
  • encoding = “Unicode”;
  • break;
  • // 判断不出来就使用GBK,这样可以在大多数情况下正确处理中文
  • default:
  • encoding = “GBK”;
  • break;
  • }
  • stream.Close();
  • delete stream;
  • stream = null;
  • return encoding;
  • }

这样,在需要的时候,通过调用CheckEncoding函数就可以获取文件的编码了。

希望此文对你有所帮助。

xujiwei

ASP中使用FileSystemObject时提高性能的一个小技巧

在封装自己的FileSystemObject库的时候,测试的时候发现在文件夹或文件很多的时候,效率很低,显示一个文件夹需要2秒甚至更多,这让我很是奇怪,因为显示文件夹及文件信息的时候直接都是使用Folder及File对象的属性,这应该不会引起性能上的问题,但是事实却说明我的想法过于简单了。

按个测试了一下可能会是哪些属性引起的性能问题,在去掉Type也就是类型属性显示的时候,性能有了很大提高,之后的测试也证明了是Type属性的使用导致了性能问题。

仔细想了一下,Type引起性能低的原因应该是,引用Type属性所得到的是文件的具体类型信息,也就是我们在资源浏览器里看到的那样,比如TXT文件的类型就是显示为“文本文档”,但是这个类型信息却是存储在系统中,通过文件扩展名进行关联的。在FSO中使用Type属性的时候,对于每个File对象,FSO都需要根据扩展名去系统中检索这个扩展名对应的类型名称,这样,就极大的降低了性能。

因此,在使用FileSystemObject时,如果可以不使用File或者Folder对象的Type属性,就尽量不使用。

希望此文对你有所帮助。

by Xu Jiwei

Subversion 配置笔记

在决定转向SVN之后,就去下了个Subversion 1.4.6装上,但是默认的情况下,SVN并不像CVSNT那样提供一下基于网络的访问接口,因此在一开始,我只能用TortoiseSVN使用file:///协议来访问版本库。

这样终究不是个办法,因此去网上找了找,发现SVN本身也提供将SVN安装成服务的方法,只要自己添加一下就行了。使用以下命令:

sc create svnserve binpath= “c:\svnserve\svnserve.exe –service
–root c:\repos” displayname= “Subversion” depend= tcpip start= auto

注意,如果你是在Vista下面的话,需要使用管理员权限来添加服务。还有一点就是,在输入命令的时候,属性名称后面跟着=,不能有空格,但是=与后面的值之间必须有一个空格。

配置之后就可以用svn://协议来访问版本库了。

配置网络访问之后,还需要设置一下访问权限,这个在版本库conf目录里的svnserve.conf里配置。

找到 [general] 段,可以从注释里看到配置匿名访问、密码数据库等等选项。其中 anon-access 是用来设定版本库的匿名访问权限,auth-access 是用来设定登录用户的访问权限,password-db 是用来设定用户密码数据库,一般取默认 passwd 就行了,realm 是用来设定版本库的域,如果两个版本库的的域一样,那么它们就会使用同一个用户密码数据库。

用户权限有 none、read、write 三种,我的配置如下:

[general]
anon-access = none
auth-access = write
password-db = passwd
realm = my subversion

最后,在同个目录下的 passwd 文件中添加用户名密码即可,格式为“用户名 = 密码”,一行一个帐号。

提高Vista开始菜单文件夹展开速度的小技巧

用了Vista一段时间,总是觉得Vista的开始菜单里的文件夹展开速度很慢,以前配置不是很好,可以理解为配置的原因,但是现在配置应该也不差了吧,怎么会还是这样呢。

某天玩电脑的时候突然想到,会不会是那个“高亮显示新安装的程序”的原因,试了一下,开始菜单里的文件夹展开速度果然快了很多。

如果你的Vista在进入开始菜单,展开文件夹的时候速度也是很慢的话,不妨试试禁止“高亮显示新安装的程序”,步骤是:在开始的微软徽标上右击,选择属性,然后进入“开始”菜单选项卡,点击“自定义”,打开“自定义’开始’菜单”对话框,在列表中找到“突出显示新安装的程序”,取消选中这个项目,然后确定两遍即可。

跟VMware有得比的虚拟机,VirtualBox

新硬盘到手,装好vista,又准备装个Ubuntu 8.04,但是只有镜像没有光盘,又没有空的CD刻录盘,于是就先在虚拟机去体验一把了。

虚拟机到现在我也用过不少了,Virtual PC、VMware、Bochs、QEMU这几个常见的虚拟机都用过,但是就速度和功能上来说,还是首选的VMware。自从Virtual PC被微软收购之后,貌似就没怎么用过了,一方面微软把Guest OSes限制在了Windows系列,虽然安装其他系统也是行,但是总是感觉不太舒服的,另一方面就是Virtual PC的速度有待提高了。

VMware安装Ubuntu非常方便,直接镜像放进去,按正常步骤安装。

在虚拟机里安装好Ubuntu之后,想用用VMware for Linux版的Unity功能,于是就去下了个VMware for Linux 6.5 Beta,弄到虚拟机里。

但是,安装完VMware,在Ubuntu里安装系统的时候才发现,VMware不支持在虚拟机里的虚拟机安装系统……

好吧,既然VMware检测了Host OS是否运行在虚拟机环境里,那么我换个虚拟机总行了吧。

Linux里的虚拟机,以前也玩过,还是知道有个VirtualBox的,然后又想到之前有看到新闻说VirtualBox也支持类似VMware Fusion那样的无缝运行了。赶紧去VirtualBox官方网站下了个v1.5.6的。

安装完VirtualBox启动它,界面很是简洁,左边是虚拟机列表,右边是选中的虚拟机的配置信息,这个布局很像Virtual PC,只不过VPC只有虚拟机列表而已。

图片附件

先装个TinyXP试试。TinyXP安装很快,10分钟左右就搞定了。然后安装附加软件包,重启客户机之后,无缝模式已经可以用了,感觉比较好,效率比VMware高,停顿的感觉没有VMware那么明显。

昨天在VirtualBox官方看到了v1.6.0的changelog,但是却没有找到v1.6.0的下载,还很奇怪,今天能下载了才想起来VirtualBox被Sun收购了,v1.6.0是被Sun收购之后推出的第一个版本,看changelog里改变蛮大的,我比较关注其中有一个就是支持Linux客户机的无缝运行。

下了v1.6.0,重新安装后,把安装好的Ubuntu附加软件升级了一下,无缝模式也可以运行了。

没有运行在无缝模式下的Ubuntu,桌面分辨率可以随窗口大小而改变。

图片附件

运行在无缝模式下的Ubuntu,下面这张图里是Ubuntu的终端和Windows的cmd一起运行的情况。

图片附件

感觉VirtualBox在Linux下的无缝模式还不是很稳定,不过也有可能是因为没有安装好的关系,不过不管怎么说,VirtualBox的速度和功能还是让人比较满意的,等有Ubuntu 8.04的CD之后,也去装一个。