txt转word vbscript

保存为.vbs,将需要转换的文本文档和它放在同一目录下即可。
---------------------------------------------------------------------邪恶的分割线---------------

Dim FSO,s
Set FSO=CreateObject("Scripting.FileSystemObject")
Set AllF=FSO.GetFolder(fso.GetParentFolderName (WScript.ScriptFullName ))
For Each file In AllF.Files
    if right(file,3)="txt" then zhuanhuan file
Next
msgbox "已经将所有文本文件转换成WORD文件!",48+4096,"操作成功"
sub zhuanhuan(filename)
    name=fso.getbasename(filename)
    set file=fso.opentextfile(filename)
    s=file.readall
    file.close
    Set objWord = CreateObject("Word.Application")
    'objWord.Visible = True
    Set objDoc = objWord.Documents.Add()
    objword.Selection.TypeText s
    objword.ActiveDocument.SaveAs AllF & "\" & name & ".doc"
    objword.quit
end sub


//不同编码读取方式
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%> 
<% Response.CodePage=65001%>  
<% Response.Charset="UTF-8" %>  
<% 
'申明变量 
dim read_path,write_paht,content 
'----读取文件内容------------------------ 
Function ReadTextFile(filePath,CharSet) 
       dim stm 
       set stm=Server.CreateObject("adodb.stream")  
       stm.Type=1 'adTypeBinary,按二进制数据读入 
       stm.Mode=3 'adModeReadWrite ,这里只能用3用其他会出错 
       stm.Open  
       stm.LoadFromFile filePath 
       stm.Position=0 '把指针移回起点 
       stm.Type=2 '文本数据 
       stm.Charset=CharSet 
       ReadTextFile = stm.ReadText 
       stm.Close  
       set stm=nothing  
End Function 
'----写入文件------------------------ 
Sub WriteTextFile(filePath,fileContent,CharSet) 
       dim stm 
       set stm=Server.CreateObject("adodb.stream")  
       stm.Type=2 'adTypeText,文本数据 
       stm.Mode=3 'adModeReadWrite,读取写入,此参数用2则报错 
       stm.Charset=CharSet 
       stm.Open  
       stm.WriteText fileContent   
       stm.SaveToFile filePath,2 'adSaveCreateOverWrite,文件存在则覆盖 
       stm.Flush  
       stm.Close  
       set stm=nothing  
End Sub 
'要读取的文件路径 
read_path = Server.MapPath("example.xml") 
'要写入的文件路径 
write_path = Server.MapPath("example.asp") 
'读取的文件内容 
content = ReadTextFile(read_path,"utf-8") 
'输出读取的文件 
Response.Write(content) 
'开始写入 
call WriteTextFile(write_path,content,"utf-8") 
%>

提供一个UTF-8转换GB2312的,对照学习一下吧
'*/-------------------------------------------------------------
'*/模 块 名:mUTF8
'*/功    能:UTF-8转换GB2312函数
'*/示    例:UTF2GB("%E9%83%BD%E5%B8%82%E6%83%85%E7%B7%A3%E6%98%9F%E5%BA%A7")
'*/-------------------------------------------------------------
Public Function UTF2GB(UTFStr As String) As String
    For Dig = 1 To Len(UTFStr)
        If Mid(UTFStr, Dig, 1) = "%" Then
           If Len(UTFStr) >= Dig + 8 Then
              GBStr = GBStr & ConvChinese(Mid(UTFStr, Dig, 9))
              Dig = Dig + 8
           Else
              GBStr = GBStr & Mid(UTFStr, Dig, 1)
           End If
        Else
           GBStr = GBStr & Mid(UTFStr, Dig, 1)
        End If
    Next
    UTF2GB = GBStr
End Function

Public Function ConvChinese(X)
    A = Split(Mid(X, 2), "%")
    i = 0
    j = 0
    
    For i = 0 To UBound(A)
        A(i) = c16to2(A(i))
    Next
    
    For i = 0 To UBound(A) - 1
        DigS = InStr(A(i), "0")
        Unicode = ""
        For j = 1 To DigS - 1
            If j = 1 Then
               A(i) = right(A(i), Len(A(i)) - DigS)
               Unicode = Unicode & A(i)
            Else
               i = i + 1
               A(i) = right(A(i), Len(A(i)) - 2)
               Unicode = Unicode & A(i)
            End If
        Next
        
        If Len(c2to16(Unicode)) = 4 Then
           ConvChinese = ConvChinese & ChrW(Int("&H" & c2to16(Unicode)))
        Else
           ConvChinese = ConvChinese & Chr(Int("&H" & c2to16(Unicode)))
        End If
    Next
End Function

Public Function c2to16(X)
    i = 1
    For i = 1 To Len(X) Step 4
        c2to16 = c2to16 & Hex(c2to10(Mid(X, i, 4)))
    Next
End Function

Public Function c2to10(X)
    c2to10 = 0
    If X = "0" Then Exit Function
        i = 0
    For i = 0 To Len(X) - 1
        If Mid(X, Len(X) - i, 1) = "1" Then c2to10 = c2to10 + 2 ^ (i)
    Next
End Function

Public Function c16to2(X)
    i = 0
    For i = 1 To Len(Trim(X))
        TempStr = c10to2(CInt(Int("&h" & Mid(X, i, 1))))
        Do While Len(TempStr) < 4
            TempStr = "0" & TempStr
        Loop
        c16to2 = c16to2 & TempStr
    Next
End Function

Public Function c10to2(X)
    mysign = Sgn(X)
    X = Abs(X)
    DigS = 1
    Do
        If X < 2 ^ DigS Then
            Exit Do
        Else
            DigS = DigS + 1
        End If
    Loop
    tempnum = X
    
    i = 0
    For i = DigS To 1 Step -1
        If tempnum >= 2 ^ (i - 1) Then
            tempnum = tempnum - 2 ^ (i - 1)
            c10to2 = c10to2 & "1"
        Else
            c10to2 = c10to2 & "0"
        End If
    Next
    If mysign = -1 Then c10to2 = "-" & c10to2
End Function

2、'GB转UTF8--将GB编码文字转换为UTF8编码文字

Function toUTF8(szInput)
    Dim wch, uch, szRet
    Dim x
    Dim nAsc, nAsc2, nAsc3
    '如果输入参数为空,则退出函数
    If szInput = "" Then
        toUTF8 = szInput
        Exit Function
    End If
    '开始转换
     For x = 1 To Len(szInput)
        '利用mid函数分拆GB编码文字
        wch = Mid(szInput, x, 1)
        '利用ascW函数返回每一个GB编码文字的Unicode字符代码
        '注:asc函数返回的是ANSI 字符代码,注意区别
        nAsc = AscW(wch)
        If nAsc < 0 Then nAsc = nAsc + 65536
   
        If (nAsc And &HFF80) = 0 Then
            szRet = szRet & wch
        Else
            If (nAsc And &HF000) = 0 Then
                uch = "%" & Hex(((nAsc \ 2 ^ 6)) Or &HC0) & Hex(nAsc And &H3F Or &H80)
                szRet = szRet & uch
            Else
               'GB编码文字的Unicode字符代码在0800 - FFFF之间采用三字节模版
                uch = "%" & Hex((nAsc \ 2 ^ 12) Or &HE0) & "%" & _
                            Hex((nAsc \ 2 ^ 6) And &H3F Or &H80) & "%" & _
                            Hex(nAsc And &H3F Or &H80)
                szRet = szRet & uch
            End If
        End If
    Next
       
    toUTF8 = szRet
End Function

3、'GB转unicode---将GB编码文字转换为unicode编码文字

function chinese2unicode(Str)
  dim i
  dim Str_one
  dim Str_unicode
  if(isnull(Str)) then
     exit function
  end if
  for i=1 to len(Str)
    Str_one=Mid(Str,i,1)
    Str_unicode=Str_unicode&chr(38)
    Str_unicode=Str_unicode&chr(35)
    Str_unicode=Str_unicode&chr(120)
    Str_unicode=Str_unicode& Hex(ascw(Str_one))
    Str_unicode=Str_unicode&chr(59)
  next
  chinese2unicode=Str_unicode
end function  

4、'URL解码
Function URLDecode(enStr)
dim deStr
dim c,i,v
deStr=""
for i=1 to len(enStr)
  c=Mid(enStr,i,1)
  if c="%" then
   v=eval("&h"+Mid(enStr,i+1,2))
   if v<128 then
    deStr=deStr&chr(v)
    i=i+2
   else
    if isvalidhex(mid(enstr,i,3)) then
     if isvalidhex(mid(enstr,i+3,3)) then
      v=eval("&h"+Mid(enStr,i+1,2)+Mid(enStr,i+4,2))
      deStr=deStr&chr(v)
      i=i+5
     else
      v=eval("&h"+Mid(enStr,i+1,2)+cstr(hex(asc(Mid(enStr,i+3,1)))))
      deStr=deStr&chr(v)
      i=i+3
     end if
    else
     destr=destr&c
    end if
   end if
  else
   if c="+" then
    deStr=deStr&" "
   else
    deStr=deStr&c
   end if
  end if
next
URLDecode=deStr
end function

'判断是否为有效的十六进制代码
function isvalidhex(str)
dim c
isvalidhex=true
str=ucase(str)
if len(str)<>3 then isvalidhex=false:exit function
if left(str,1)<>"%" then isvalidhex=false:exit function
  c=mid(str,2,1)
if not (((c>="0") and (c<="9")) or ((c>="A") and (c<="Z"))) then isvalidhex=false:exit function
  c=mid(str,3,1)
if not (((c>="0") and (c<="9")) or ((c>="A") and (c<="Z"))) then isvalidhex=false:exit function
end function
%>

 参考资料

GB2312 字符集

GB2312又称为GB2312-80字符集,全称为《信息交换用汉字编码字符集·基本集》,由原中国国家标准总局发布,1981年5月1日实施,是中国国家标准的简体中文字符集。它所收录的汉字已经覆盖99.75%的使用频率,基本满足了汉字的计算机处理需要。在中国大陆和新加坡获广泛使用。

GB2312收录简化汉字及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共 7445 个图形字符。其中包括6763个汉字,其中一级汉字3755个,二级汉字3008个;包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。

GB2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。

它是用双字节表示的,两个字节中前面的字节为第一字节,后面的字节为第二字节。习惯上称第一字节为“高字节” ,而称第二字节为“低字节”。“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。

以GB2312字符集的第一个汉字“啊”字为例,它的区号16,位号01,则区位码是1601,在大多数计算机程序中,高字节和低字节分别加0xA0得到程序的汉字处理编码0xB0A1。计算公式是:0xB0=0xA0+16, 0xA1=0xA0+1。

GBK字符集
GBK字符集是GB2312的扩展(K),GBK1.0收录了21886个符号,它分为汉字区和图形符号区,汉字区包括21003个字符。GBK字符集主要扩展了繁体中文字的支持。


BIG5 字符集

BIG5又称大五码或五大码,1984年由台湾财团法人信息工业策进会和五间软件公司宏碁 (Acer)、神通 (MiTAC)、佳佳、零壹 (Zero One)、大众 (FIC)创立,故称大五码。Big5码的产生,是因为当时台湾不同厂商各自推出不同的编码,如倚天码、IBM PS55、王安码等,彼此不能兼容;另一方面,台湾政府当时尚未推出官方的汉字编码,而中国大陆的GB2312编码亦未有收录繁体中文字。

Big5字符集共收录13,053个中文字,该字符集在中国台湾使用。耐人寻味的是该字符集重复地收录了两个相同的字:“兀”(0xA461及0xC94A)、“嗀”(0xDCD1及0xDDFC)。

Big5码使用了双字节储存方法,以两个字节来编码一个字。第一个字节称为“高位字节”,第二个字节称为“低位字节”。高位字节的编码范围0xA1-0xF9,低位字节的编码范围0x40-0x7E及0xA1-0xFE。

尽管Big5码内包含一万多个字符,但是没有考虑社会上流通的人名、地名用字、方言用字、化学及生物科等用字,没有包含日文平假名及片假字母。

例如台湾视“着”为“著”的异体字,故没有收录“着”字。康熙字典中的一些部首用字(如“亠”、“疒”、“辵”、“癶”等)、常见的人名用字(如“堃”、“煊”、“栢”、“喆”等) 也没有收录到Big5之中。


GB18030 字符集

GB18030的全称是GB18030-2000《信息交换用汉字编码字符集基本集的扩充》,是我国政府于2000年3月17日发布的新的汉字编码国家标准,2001年8月31日后在中国市场上发布的软件必须符合本标准。GB 18030字符集标准的出台经过广泛参与和论证,来自国内外知名信息技术行业的公司,信息产业部和原国家质量技术监督局联合实施。

GB 18030字符集标准解决汉字、日文假名、朝鲜语和中国少数民族文字组成的大字符集计算机编码问题。该标准的字符总编码空间超过150万个编码位,收录了27484个汉字,覆盖中文、日文、朝鲜语和中国少数民族文字。满足中国大陆、香港、台湾、日本和韩国等东亚地区信息交换多文种、大字量、多用途、统一编码格式的要求。并且与Unicode 3.0版本兼容,填补Unicode扩展字符字汇“统一汉字扩展A”的内容。并且与以前的国家字符编码标准(GB2312,GB13000.1)兼容。

编码方法:
GB 18030标准采用单字节、双字节和四字节三种方式对字符编码。单字节部分使用0×00至0×7F码(对应于ASCII码的相应码)。双字节部分,首字节码从0×81至0×FE,尾字节码位分别是0×40至0×7E和0×80至0×FE。四字节部分采用GB/T 11383未采用的0×30到0×39作为对双字节编码扩充的后缀,这样扩充的四字节编码,其范围为0×81308130到0×FE39FE39。其中第一、三个字节编码码位均为0×81至0×FE,第二、四个字节编码码位均为0×30至0×39。

按照程序员的称呼,GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。

接着是国际通用的unicode字符集

Unicode字符集(简称为UCS)

1.名称的由来

Unicode字符集编码是(Universal Multiple-Octet Coded Character Set) 通用多八位编码字符集的简称,支持世界上超过650种语言的国际字符集。Unicode允许在同一服务器上混合使用不同语言组的不同语言。它是由一个名为 Unicode 学术学会(Unicode Consortium)的机构制订的字符编码系统,支持现今世界各种不同语言的书面文本的交换、处理及显示。该编码于1990年开始研发,1994年正式公布,最新版本是2005年3月31日的Unicode 4.1.0。Unicode是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

2.编码方法

Unicode 标准始终使用十六进制数字,而且在书写时在前面加上前缀“U+”,例如字母“A”的编码为 004116 。所以“A”的编码书写为“U+0041”。

3.UTF-8 编码
UTF-8是Unicode的其中一个使用方式。 UTF是 Unicode Translation Format,即把Unicode转做某种格式的意思。

UTF-8便于不同的计算机之间使用网络传输不同语言和编码的文字,使得双字节的Unicode能够在现存的处理单字节的系统上正确传输。

UTF-8使用可变长度字节来储存 Unicode字符,例如ASCII字母继续使用1字节储存,重音文字、希腊字母或西里尔字母等使用2字节来储存,而常用的汉字就要使用3字节。辅助平面字符则使用4字节。

4.UTF-16 和 UTF-32 编码
UTF-32、UTF-16 和 UTF-8 是 Unicode 标准的编码字符集的字符编码方案,UTF-16 使用一个或两个未分配的 16 位代码单元的序列对 Unicode 代码点进行编码;UTF-32 即将每一个 Unicode 代码点表示为相同值的 32 位整数

通过一个问题了解unicode编码

问题:使用Windows记事本的“另存为”,可以在ANSI、GBK、Unicode、Unicode big endian和UTF-8这几种编码方式间相互转换。同样是txt文件,Windows怎样识别编码方式的呢?
我很早前就发现Unicode、Unicode big endian和UTF-8编码的txt文件的开头会多出几个字节,分别是FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8)。但这些标记是基于什么标准呢?

答案:

ANSI字符集定义:ASCII字符集,以及由此派生并兼容的字符集,如:GB2312,正式的名称为MBCS(Multi-Byte Chactacter System,多字节字符系统),通常也称为ANSI字符集。

UNICODE 与 UTF8、UTF16

由于每种语言都制定了自己的字符集,导致最后存在的各种字符集实在太多,在国际交流中要经常转换字符集非常不便。因此,产生了Unicode字符集,它固定使用16 bits(两个字节)来表示一个字符,共可以表示65536个字符
标准的 Unicode 称为UTF-16(UTF:UCS Transformation Format )。后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,出现了UTF-8,使用类似MBCS的方式对Unicode进行编码。(Unicode字符集有多种编码形式)
例如"连通"两个字的Unicode标准编码UTF-16 (big endian)为:DE 8F 1A 90
而其UTF-8编码为:E8 BF 9E E9 80 9A

当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集的哪种编码保存的。软件一般采用三种方式来决定文本的字符集和编码:
检测文件头标识,提示用户选择,根据一定的规则猜测
最标准的途径是检测文本最开头的几个字节,开头字节 Charset/encoding,如下表:
EF BB BF UTF-8
FE FF UTF-16/UCS-2, little endian
FF FE UTF-16/UCS-2, big endian
FF FE 00 00 UTF-32/UCS-4, little endian.
00 00 FE FF UTF-32/UCS-4, big-endian.


1、big endian和little endian
big endian和little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big endian。还是将49写在前面,就是little endian。
“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。
我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。

2、字符编码、内码,顺带介绍汉字编码
字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。
GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。
GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平台必须支持GB18030,对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。
从ASCII、GB2312、GBK到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼,GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。
有的中文Windows的缺省内码还是GBK,可以通过GB18030升级包升级到GB18030。不过GB18030相对GBK增加的字符,普通人是很难用到的,通常我们还是用GBK指代中文Windows内码。
这里还有一些细节:
GB2312的原文还是区位码,从区位码到内码,需要在高字节和低字节上分别加上A0。
在DBCS中,GB内码的存储格式始终是big endian,即高位在前。
GB2312的两个字节的最高位都是1。但符合这个条件的码位只有128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是1。不过这不影响DBCS字符流的解析:在读取DBCS字符流时,只要遇到高位为1的字节,就可以将下两个字节作为一个双字节编码,而不用管低字节的高位是什么。

3、Unicode、UCS和UTF(UCS Transformation Format)
前面提到从ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。而Unicode只与ASCII兼容(更准确地说,是与ISO-8859-1兼容),与GB码不兼容。例如“汉”字的Unicode编码是6C49,而GB码是BABA。

UCS规定了怎么用多个字节表示各种文字。而怎样传输这些编码,是由UTF(UCS Transformation Format)规范规定的!常见的UTF规范包括UTF-8、UTF-7、UTF-16。

4、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来标记文本文件的编码方式的。


写到这里对编码有了大致的了解了,就可以理解网上一些文章的话了,比如有一篇很流行的文章《URL编码与SQL注射》里面有一段是这么说的:

其实url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如“\”,它的ascii码是92,92的十六进制是5c,所以“\”的url编码就是%5c。那么汉字的url编码呢?很简单,看例子:“胡”的ascii码是-17670,十六进制是BAFA,url编码是“%BA%FA”。呵呵,知道怎么转换的了吧。


这得从ASCII说起,扩展的ASCII字符集采用8bit255个字符显然不够用,于是各个国家纷纷制定了自己的文字编码规范,其中中文的文字编码规范叫做“GB2312-80”(就是GB2312),它是和ASCII兼容的一种编码规范,其实就是用扩展ASCII没有真正标准化这一点,把一个中文字符用两个扩展ASCII字符来表示。文中说的的中文ASCII码实际上就是简体中文的编码2312GB!它把ASCII又扩充了一个字节,由于高位的第一位是0,所以会出现负数的形式,url编码就是将汉字的这个GB2312编码转化成UTF-8的编码并且每8位即一个字节前面加上%符号表示。

那为何UTF-8是进行网络的规范传输编码呢?

在Unicode里,所有的字符被一视同仁。汉字不再使用“两个扩展ASCII”,而是使用“1个Unicode”,注意,现在的汉字是“一个字符”了,于是,拆字、统计字数这些问题也就自然而然的解决了。但是,这个世界不是理想的,不可能在一夜之间所有的系统都使用Unicode来处理字符,所以Unicode在诞生之日,就必须考虑一个严峻的问题:和ASCII字符集之间的不兼容问题。

我们知道,ASCII字符是单个字节的,比如“A”的ASCII是65。而Unicode是双字节的,比如“A”的Unicode是0065,这就造成了一个非常大的问题:以前处理ASCII的那套机制不能被用来处理Unicode了

另一个更加严重的问题是,C语言使用'\0'作为字符串结尾,而Unicode里恰恰有很多字符都有一个字节为0,这样一来,C语言的字符串函数将无法正常处理Unicode,除非把世界上所有用C写的程序以及他们所用的函数库全部换掉

于是,比Unicode更伟大的东东诞生了,之所以说它更伟大是因为它让Unicode不再存在于纸上,而是真实的存在于我们大家的电脑中。那就是:UTF

UTF= UCS Transformation Format UCS转换格式,它是将Unicode编码规则和计算机的实际编码对应起来的一个规则。现在流行的UTF有2种:UTF-8和UTF-16

其中UTF-16和上面提到的Unicode本身的编码规范是一致的,这里不多说了。而UTF-8不同,它定义了一种“区间规则”,这种规则可以和ASCII编码保持最大程度的兼容,这样做的好处是压缩了字符在西欧一些国家的内存消耗,减少了不必要的资源浪费,这在实际应用中是非常有必要的。

UTF-8有点类似于Haffman编码,它将Unicode编码为:
00000000-0000007F的字符,用单个字节来表示;

00000080-000007FF的字符用两个字节表示 (中文的编码范围)

00000800-0000FFFF的字符用3字节表示

因为目前为止Unicode-16规范没有指定FFFF以上的字符,所以UTF-8最多是使用3个字节来表示一个字符。但理论上来说,UTF-8最多需要用6字节表示一个字符。

在UTF-8里,英文字符仍然跟ASCII编码一样,因此原先的函数库可以继续使用。而中文的编码范围是在0080-07FF之间,因此是2个字节表示(但这两个字节和GB编码的两个字节是不同的)。


看看编码之多:ANSI,AscII,GB2312,GBK,BIG5,GB18030,Unicode,UCS(就是unicode)Utf-8,utf-16,utf-32 整整10种编码~,算是够复杂了
可是这还仅仅是个开始,应用方面变化无穷,不过现在看到这些东西起码再不会头大了!呼呼~


哦,漏了一个加密的base64编码。

什么是Base64?

按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)

为什么要使用Base64?

在设计这个编码的时候,我想设计人员最主要考虑了3个问题:
1.是否加密?
2.加密算法复杂程度和效率
3.如何处理传输?

加密是肯定的,但是加密的目的不是让用户发送非常安全的Email。这种加密方式主要就是“防君子不防小人”。即达到一眼望去完全看不出内容即可。
基于这个目的加密算法的复杂程度和效率也就不能太大和太低。和上一个理由类似,MIME协议等用于发送Email的协议解决的是如何收发Email,而并不是如何安全的收发Email。因此算法的复杂程度要小,效率要高,否则因为发送Email而大量占用资源,路就有点走歪了。

但是,如果是基于以上两点,那么我们使用最简单的恺撒法即可,为什么Base64看起来要比恺撒法复杂呢?这是因为在Email的传送过程中,由于历史原因,Email只被允许传送ASCII字符,即一个8位字节的低7位。因此,如果您发送了一封带有非ASCII字符(即字节的最高位是1)的Email通过有“历史问题”的网关时就可能会出现问题。网关可能会把最高位置为0!很明显,问题就这样产生了!因此,为了能够正常的传送Email,这个问题就必须考虑!所以,单单靠改变字母的位置的恺撒之类的方案也就不行了。关于这一点可以参考RFC2046。
基于以上的一些主要原因产生了Base64编码。

鉴于算法比较让人头大,想看的人自然会有看到的办法拉,俺是头大得很,就不放上来了。


VBA开发实用指南  
  唐大中 附录文章

  VBA(Visual Basic for Application)是Office自带的二次开发工具,可为日常办公带来极大的便利。本文讲述Office各个成员VBA开发的常用对象和其相关的属性、方法和事件(包括Word、Excel、PowerPoint等),并给出相关的实例代码。

  一、VBA基础
  1.什么是VBA

  在Office对于一些烦琐、重复的操作,用户可以通过“宏”来实现。“宏”即是由一系列命令和指令组合而成的命令集,其本质是VBA代码组成的程序。VBA是微软在其开发的应用程序中共享的通用自动化语言。

  2.录制/运行宏

  VBA初期开发可通过录制“宏”的操作来获取代码,在Office中几乎所有的操作均可通过录制“宏”来获取代码。这里,我们通过一个简单的“宏”录制实例来学习:在Word中将所有的“电脑”字样替换为“计算机”,并插入一张4行2列的表格。

  在Office中录制宏,可单击“工具→宏→录制新宏…”菜单命令实现,单击该命令后将出现“录制宏”对话框,如图1所示。

 

  其中,“宏名”框用于为录制的宏设置名称,可使用默认的“Macro1”。“工具栏”和“键盘”二个按钮分别用于设置宏的触发位置。“将宏保存在”框可设置宏的保存位置,一般包括“Normal.dot”(共用模板)和当前文档2种,建议保存在当前文档中,以免对所有文档产生影响。在“说明”框中可输入对该宏的相关说明。单击“确定”按钮,即可开始录制宏。此时在文档编辑界面中将显示“宏录制”工具栏。该工具栏有2个与录音机非常类似的按钮,第一个按钮为“停止录制”,第二个按钮为“暂停录制”。在录制过程中可随时通过这二个按钮来进行控制。

  随后按常规操作来实现前述的任务,操作完成后单击“停止录制”按钮,结束录制即可。

  注意:录制“宏”时可使用鼠标单击菜单和按钮,但无法录制鼠标在文档窗口中的移动,因此必须通过键盘来实现这些动作。此外,Office中所有录制的“宏”,其名称的首字符必须为字母或汉字、数字及下划线(名称最多可为255个字符),且“宏”名称中不允许包含空格。

  运行已录制的“宏”,可单击“工具→宏→宏”菜单命令。在出现的“宏”对话框的“宏名”下拉框中选择需运行的宏,然后单击“运行”按钮即可。随后Word将自动重现前述执行的操作,避免了重复的办公操作。

  3.宏的局限性

  虽然Office的大部分操作均可用录制“宏”的方法来保存,但录制的“宏”仅“忠实”地再现了特定的操作,对于一些需要进行逻辑判断和流程控制的操作,则显得力不从心,如自动替换多个不同的内容时,按录制“宏”的方式操作,需要按替换内容的数量录制多个“宏”,且每个“宏”仅可用于某个内容的替换,反而为工作增添了麻烦。

  录制“宏”存在很多局限性,除无法进行逻辑判断和流程控制操作外,还包括很多。如交互能力较差、无法显示Office的内置对话框、无法显示用户自定义的窗体和无法创建复杂的工具栏或修改菜单等。

  4.VBA编辑环境

  虽然“宏”存在很多局限性,但通过录制“宏”获取了VBA代码后即可通过VBA编辑器来为代码添加逻辑控制并设计流程等。以Word 2002为例,“宏”录制完成后,可在运行宏对话框中选择录制的宏并单击“编辑”按钮,即可显示VBA编辑环境,如图2所示。

 

  VBA编辑环境由工程资源管理器、属性窗口和代码编辑/窗体设计窗口等部分组成。在工程资源管理器中列出当前打开的所有VBA项目,属性窗口用于设置相关对象的属性,代码编辑/窗体设计窗口则可输入模块的代码或编辑窗体和类模块。

  二、VBA开发共用对象详解
  VBA和其他面向对象的开发语言类似,同样有非常多的对象组成,且不同的Office成员即提供了大量的开发对象,如工具栏、Office助手、内置对话框和窗体等。

  (一)工具栏及其控件对象
  在Office中通过VBA开发工具栏和菜单,需使用Office提供的CommandBar、CommandBarButton、CommandBarComboBox等对象,这些对象即代表工具栏、工具栏按钮和工具栏下拉框,通过这些对象可编制出各类复杂的工具栏或菜单。

  1.CommandBars集合

  该集合代表Office所有的工具栏,可用名称或索引号指定菜单栏或工具栏,但仅可用名称指定一个菜单、快捷菜单或子菜单。如两个或两个以上自定义菜单或子菜单名称相同,则返回第一个具有该名称的对象。

  其Add方法用于新建一个工具栏,并返回 CommandBar对象。

  语法:expression.Add(Name, Position, MenuBar, Temporary)

  参数说明:

  Name为可选的Variant 类型,代表新工具栏的名称。如果省略,则使用默认的名称;Position为可选的Variant 类型,代表新工具栏的位置。该参数值可通过VBA常量进行设置,如msoBarLeft、msoBarTop、msoBarRight、msoBarBottom常量(设置新工具栏位于软件工具栏中位置);msoBarFloating常量(代表新工具栏可移动);msoBarPopup常量(代表新工具栏为快捷菜单)等;MenuBar为可选的Variant 类型,用于设置是否用新工具栏替换活动工具栏;Temporary为可选的Variant 类型,用于设置新工具栏是否暂时有效。

  2.CommandBar对象

  该对象代表应用程序中的工具栏,新建工具栏的控件均以该对象为载体。

  (1)Controls属性:返回CommandBarControls对象,代表指定工具栏中的所有控件。

  (2)NameLocal属性:返回由应用程序版本语言所设置的工具栏名称,如对软件的内置工具栏设置会出现错误。

  (3)Position属性:返回或设置工具栏的位置,值可通过VBA常量进行设置,如msoBarLeft、msoBarTop、msoBarRight、msoBarBottom、msoBarFloating、msoBarPopup或msoBarMenu等。

  (4)Type属性:返回或设置工具栏的类型,值可通过VBA常量进行设置,如msoBarTypeNormal(工具栏为普通类型)、msoBarTypeMenuBar(工具栏为菜单类型)、msoBarTypePopup(工具栏为弹出菜单类型)等。

  (5)Reset方法:将内置工具栏重置为默认设置,在恢复软件原有工具栏或菜单时非常有用。重置内置工具栏将删除其中的自定义控件并恢复其内置控件。

  3.CommandBarControls集合

  该集合代表工具栏中的所有工具栏控件。

  其Add方法用于在CommandBarControls集合中增加一个工具栏控件。

  4.CommandBarControl对象

  该对象代表工具栏控件,对自定义工具栏控件,可使用 CommandBarButton、CommandBarComboBox和CommandBarPopup对象进行定义,而对软件内置的控件进行操作,而该控件又无法使用上述三个对象表示,则可使用CommandBarControl对象。

  (1)BeginGroup属性:用于设置工具栏控件是否分组显示。

  (2)Caption属性:用于设置工具栏控件的标题文字,并可作为默认的控件屏幕提示。

  (3)Id属性:用于设置CommandBarButton、CommandBarComboBox和CommandBarControl对象的功能,这些控件可直接设置为内置工具栏控件的ID,这样该控件即具备了软件内置的相应功能,自定义控件的ID属性均需设置为1。

  (4)Copy方法:将工具栏控件复制到已有的工具栏中。

  语法:expression.Copy(Bar, Before)

  参数说明:

  Bar为可选的Variant 类型,代表目标工具栏,如果省略,则控件将复制到自身所在的工具栏;Before为可选的Variant 类型,代表新控件在指定工具栏的位置,即新控件将添加至该位置的控件前,如果省略,则控件将复制到工具栏的末尾。

  (5)Type属性:返回工具栏控件的类型,可通过VBA常量进行引用,常用的工具栏控件类型如下表所示:


常量名称
含义


msoControlButton
控制按钮


msoControlButtonDropdown
带下拉列表的按钮


msoControlButtonPopup
带弹出菜单的按钮


msoControlComboBox
下拉组合控制框


msoControlDropdown
下拉列表控制框


msoControlEdit
文本框


msoControlExpandingGrid
可扩展的表格


msoControlGraphicCombo
图像下拉组合框


msoControlGraphicDropdown
图像下拉列表框


msoControlGrid
表格


msoControlPopup
弹出菜单

 

 


  5.CommandBarButton对象

  该对象代表工具栏的按钮控件。

  (1)OnAction属性:返回或设置Visual Basic代码过程名(该代码过程不可使用参数),该过程将在单击按钮后运行。

  (2)Style属性:返回或设置工具栏按钮的显示方式。值可通过VBA常量进行设置,常用的工具栏按钮控件类型如下表所示:


常量名称
含义


msoButtonIcon
包含图标的按钮


msoButtonCaption
包含标题的按钮


ButtonIconandCaption
包含图标和标题的按钮


msoButtonIconAndCaptionBelow
包含图标和标题,且标题位于底部的按钮


msoButtonIconAndWrapCaption
包含图标和标题,且标题自动换行的按钮


msoButtonWrapCaption
包含标题,且标题自动换行的按钮

 

 

 

  (3)TooltipText属性:返回或设置工具栏按钮控件的屏幕提示。

  (4)FaceId属性:返回或设置工具栏按钮的图标编号,设置工具栏按钮的外观而非其功能,自定义图标的工具栏按钮,其 FaceId属性值为 0。

  (5)CopyFace方法:将工具栏按钮控件的图标复制到剪贴板。

  (6)PasteFace方法:将剪贴板的图标内容粘贴至工具栏按钮控件。

  (7)Execute方法:运行工具栏控件对应的过程或内置命令。

  6.CommandBarComboBox对象

  该对象代表工具栏中的组合框控件。

  (1)DropDownLines属性:返回或设置组合框控件的行数,如将其设置为 0,则控件行数将取决于列表的条目数。

  (2)List属性:返回或设置组合框控件中某列表项的值,对内置组合框控件只读。

  (3)OnAction属性:返回或设置Visual Basic代码过程名(该代码过程不可使用参数),该过程在单击或更改组合框控件值时运行。

  (4)Type属性:返回或设置组合框控件的显示方式。

  (5)AddItem方法:用于在组合框控件中添加一个列表项,且该组合框控件必须为自定义的控件。

  (6)RemoveItem方法:用于从组合框控件中删除一个列表项。

  (二)助手对象
  Office助手是一组卡通动画人物,这些助手可提供友好的信息提示,并可通过自定义对话框(又称“气球”)的文字格式和控件来实现简单的交互。

  1.Assistant对象

  该对象代表Office助手,可通过Application对象的Assistant属性返回Assistant对象。默认助手为“大眼夹”(即“Clippit”),用户可在右键单击助手后出现的快捷菜单中单击“选择助手”菜单项,在弹出的“Office助手”对话框中即可选择不同的助手。

  (1)Animation属性:用于返回或设置Office 助手的动画效果。如应用于 Balloon对象,则“助手”仅在显示气球时才会出现动作,可通过常量赋值,常用的常量及其含义如下表所示:

 

常量名称
代表的动作

 

msoAnimationAppear
助手出现

 

msoAnimationBeginSpeaking
助手开始说话

 

msoAnimationCheckingSomething
助手检查动作

 

msoAnimationDisappear
助手消失

 

msoAnimationGoodbye
助手说“再见”

 

msoAnimationGreeting
助手致欢迎的动作

 

msoAnimationIdle
助手休息的动作(为默认动画效果类型)

 

msoAnimationPrinting
助手打印的动作

 

msoAnimationSaving
助手保存的动作

 

msoAnimationSearching
助手开始查找的动作

 

msoAnimationThinking
助手考虑的动作

 

 

 

  (2)AssistWithAlerts属性:用于设置助手气球是否发送给应用程序警告信息。

  (3)AssistWithHelp属性:用于设置当用户按F1键显示帮助时助手是否出现。

  (4)AssistWithWizards属性:用于设置助手是否提供向导型的联机帮助。

  (5)FeatureTips属性:用于设置助手是否更有效地提供有关应用程序功能信息。

  (6)GuessHelp属性:用于设置助手是否显示帮助主题列表。

  (7)FileName属性:用于设置助手所使用的文件名,助手文件的扩展名为“acs”,一般位于Office的安装目录下。其中“孙悟空”为mnkyking.acs;“大眼夹”为Clippit.acs;“恋恋”为OffCat.acs;“聪聪”为Rocky.acs;“七巧板”为Logo.acs;“小灵通”Dot.acs;“美丽家园”为MNature.acs;“F1”为F1.acs。

  (8)NewBalloon属性:用于新建助手气球,并返回Balloon对象。

  (9)On属性:用于设置是否使用助手。

  (10)Sounds属性:用于设置助手是否发出与动画对应的声音。

  (11)TipOfDay属性:用于设置每次启动Office时,助手是否显示专用的提示。

  2.Balloon对象

  该对象代表气球,助手可在该气球中显示标题、文字和一些控件,通过NewBalloon属性可返回Balloon对象,且任意时刻仅有一个气球可视。

  (1)BalloonType属性:用于设置助手所用的气球类型,可通过常量赋值。创建Balloon对象时,初始值为msoBalloonTypeButtons常量。

  (2)Button属性:用于设置助手气球底部按钮类型。创建Balloon对象时,初始值为msoButtonSetOK。

  (3)Icon属性:用于设置助手气球左上角的图标类型,可通过常量赋值。

  (4)Checkboxes属性:返回BalloonCheckboxes集合,即气球中的所有复选框。

  (5)Heading属性:用于设置助手气球中的标题。气球标题和文本均支持包含下划线和系统调色板16色的文字。

  如需显示包含下划线的文字,可通过“{ul}”、“{ul 1}”语法来开始下划线和“{ul 0}” 语法来清除下划线;如需改变文字颜色,可通过“{cf number}”语法,其中number常数为系统调色板支持的16种颜色。

  (6)Labels属性:返回BalloonLabels 集合,即气球中的所有标签。

  (7)Mode属性:用于设置气球的模态,即是否在显示气球的同时允许用户在程序中继续工作。

  (8)Text属性:用于设置助手在气球标签、复选框或直接显示部分的文字。

  (9)Close方法:用于关闭活动的非模态气球,仅在回调过程中才可使用。

  (10)Show方法:用于显示指定的气球对象。

  3.BalloonCheckBox对象

  该对象代表气球中的复选框控件。

  Checked属性:返回是否已选择气球中的指定复选框。

  (三)内置对话框对象
  Office使用了大量的内置对话框,在Word和Excel中提供了开发接口,使开发者可充分利用内置对话框实现很多操作,尤其在Word中可使用多种方法显示内置对话框,实现不同的功能需求,这里,我们以Word的内置对话框为例进行讲解。

  1.Dialogs集合对象

  该集合对象代表Word或Excel中的Dialog对象集合,其中每个Dialog对象均代表一个内置对话框,无法在Dialogs集合中创建新的内置对话框,也无法添加对话框。

  2.Dialog对象

  该对象代表内置对话框。

  (1)CommandName属性:用于返回显示指定内置对话框对应的过程名。

  (2)DefaultTab属性:用于设置显示指定对话框时,其被激活的选项卡。

  (3)Display方法:用于显示指定的内置对话框,并直至用户关闭该对话框或超时,使用显示内置对话框时,不会执行任何操作(即仅用于显示),但可返回用户关闭对话框时所单击的按钮代号。

  其中,返回-2,代表“关闭”按钮;返回-1,代表“确定”按钮;返回0,代表“取消”按钮;返回大于 0的值,则1代表第一个按钮,2代表第二个按钮,以此类推。

  (4)Execute方法:用于应用内置对话框的当前设置。

  (5)Show方法:用于显示并执行内置对话框,即如同用户通过菜单或工具栏打开对话框,和Display方法相同,均返回用户关闭对话框时所单击的按钮代号。

  (6)Update方法:用于更新内置对话框的参数值。

  3.显示内置对话框

  通过VBA代码可控制内置对话框的显示,如需调用指定的内置对话框,可将Dialogs属性通过常量进行赋值,如“Dialogs(wdDialogFileOpen).Show”可显示Word的“打开”对话框。在前述代码中,如将该语句的返回值赋予Dialog变量,即可通过该变量返回或设置对话框的选项,代码如下所示:

  Set testDialog = Dialogs(wdDialogFileOpen)

  合理使用内置对话框可实现很多的功能,Word和Excel中提供接口的内置对话框非常多,限于篇幅,本文不做详细介绍,读者可参考VBA的联机帮助。

  (四)窗体和相关控件对象
  VBA的编辑器和VB非常类似,因此也提供了窗体和相关的控件,但又由于Office的特点使VBA中的窗体、控件和VB存在一些差异。

  1.用户窗体知识点

  窗体是程序实现和用户交互的接口,通过窗体不仅可改善程序的界面友好性,而且可进一步增强、完善程序的功能。在VBA编辑器中可创建用户窗体,在工程资源管理器中右键单击项目,在出现的菜单中选择“插入→用户窗体”命令,随后在设计界面中将显示默认窗体和控件工具箱,该控件工具箱和VB的控件工具箱很类似,如图3所示。

 

  2.用户窗体常用控件

  虽然VBA窗体开发所用的控件和VB较为类似,但其属性和方法和VB存在一定的差异:

  (1)标签控件:该控件用于显示不可编辑的文本,默认属性为Caption属性,默认事件为Click事件。

  (2)文本框控件:该控件用于显示可编辑的文本信息,是VBA开发中最常用编辑控件,默认属性为Value属性,默认事件为Change事件。

  (3)复合框控件:该控件将列表框和文本框进行结合,用户可进行输入和列表框选择操作,默认属性为Value属性,默认事件为Change事件。

  (4)列表框控件:该控件用于显示值列表,用户可选择一个或多个列表项,VBA中的列表框可通过列表形式和选项按钮或复选框的形式使用,默认属性为Value属性,默认事件为Click事件。

  (5)复选框控件:该控件用于显示选择的状态,即允许用户从两个值(如True或False)中选择一个。如选择则将显示标记,默认属性为Value属性,默认事件为Click事件。

  (6)选项按钮控件:该控件用于显示多选项中每一项的选择状态,默认属性为Value属性,默认事件为Click事件。

  (7)切换按钮控件:该控件用于显示选择状态,默认属性为Value属性,默认事件为Click事件。

  (8)框架控件:该控件用于创建功能或视觉角度的控件组,默认事件为Click事件。

  (9)命令按钮控件:该控件用于启动、结束或中断操作,其Click事件是窗体编程中最常用的事件代码,默认属性为Value属性,默认事件为Click事件。

  (10)表头控件:该控件用于将一系列相关控件显示为一个多表的集合,默认属性为SelectedItem属性,默认事件为Change事件。

  (11) 多页控件:该控件用于将多页面的内容以单个控件的方式实现,在处理不同类别的大量信息时很有用,默认事件为Change事件。

  (12)滚动条控件:该控件用于按滚动块位置,返回或设置变量值,默认属性为Value属性,默认事件为Change事件。如需创建横向或纵向的滚动条,可在窗体设计时横向或纵向拖动滚动条控制点。

  (13)旋转按钮控件:该控件用于增加及减少变量数值,默认属性为Value属性,默认事件为Change事件。

  (14)图像控件:该控件用于显示图片,其支持的图片文件格式包括:bmp、cur、gif、ico、jpg和wmf等,默认事件为Click事件。

  在VBA窗体设计中,可将一些开发中使用的控件全部选择后,直接拖至工具箱中,工具箱会添加一个“控件组”,在窗体设计中可直接将该控件组放置于窗体,大大提高了效率(该特点为VBA所独有)。

  如开发者需使用VBA标准控件箱未提供的其他控件,可右键单击工具箱,在出现的菜单中选择“附加控件”命令,在出现的对话框中进行选择即可。

  3.用户窗体常用事件

  用户窗体的常用事件和VB窗体有一定的区别。

  (1)Initialize事件:该事件发生在加载对象后和显示对象前,通常在该事件中初始化变量值或设置控件的属性。

  (2)QueryClose事件:该事件发生在用户窗体关闭前,通常在该事件中检查用户窗体中未完成的操作。

  cancel参数:整型,如将该参数设置未非零值,则可阻止关闭用户窗体。

  Closemode参数:该参数用于获取触发QueryClose事件的原因。

  (3)Terminate事件:该事件将所有引用的对象变量设置为Nothing常量,即删除对象的引用。该事件发生在卸载对象后。如非正常退出程序,则不会触发。

  (五)类模块
  VBA开发也提供了类模块结构,使开发者可将常用操作通过类进行合理封装,实现代码的复用和程序的结构化。

  1.创建类模块

  VBA中创建类模块非常简单,在VBA编辑器的工程资源管理器中右键单击项目,在出现的菜单中选择“插入→类模块”命令,随后在“工程资源管理器”中会出现添加的类模块,默认名称为“类1”,单击该类模块,可设置其属性,一般需设置其“Name”属性,以方便使用。双击该类模块,即可按窗体的操作方法来输入代码。

  2.类模块常用事件

  类模块中包含Initialize和Terminate二个事件。

  (1)Initialize事件:该事件用于初始化类模块所用的数据。当程序中创建类模块时触发该事件。

  (2)Terminate事件:当程序中类实例从内存删除时触发该事件,且该事件仅在程序正常结束时触发。

  三、Office XP开发对象知识详解
  VBA程序的开发主要由大量的对象组成。这里,我们精选了常用的Office VBA开发常用对象的知识,以方便读者速查。

  (一)Word 2002开发对象
  1.Application对象

  该对象代表 Word 应用程序,通过该对象可访问Word中的其他所有对象。

  (1)ActiveDocument属性:返回Document对象,代表活动文档。

  (2)ActivePrinter属性:返回或设置当前打印机的名称。

  (3)ActiveWindow属性:返回Window对象,代表活动窗口。

  (4)Documents属性:返回Documents集合,代表所有打开文档。

  (5)Selection属性:返回Selection对象,代表已选择的范围或插入点。

  (6)Windows属性:返回Windows集合,代表所有文档窗口。

  (7)Activate方法:用于激活指定的对象。

  (8)PrintOut方法:打印全部或部分的文档。

  (9)Quit方法:用于退出Word程序。

  2.Document对象

  该对象代表Word中打开的文档。通过“Documents(index)”的语法可获取Document对象,其中index参数代表文档的名称或索引号,此外还可用ActiveDocument属性获取当前编辑的文档。

  (1)AttachedTemplate属性:返回Template对象,代表活动文档关联的模板。

  (2)BuiltInDocumentProperties属性:返回DocumentProperties集合,代表指定文档的所有内置属性,如作者、主题或关键词等。

  (3)Characters属性:返回Characters集合,代表文档中的字符。

  (4)Tables属性:返回Tables集合,代表文档中所有的表格。

  (5)CheckGrammar方法:检查字符串是否存在语法错误。

  (6)CheckSpelling方法:用于检查字符串是否存在拼写错误。

  (7)ComputeStatistics方法:用于获取指定文档的统计数据,如字数、页数等。

  (8)PrintPreview方法:在打印预览和视图方式间进行切换。

  (9)Save方法:用于保存文档或模板。

  (10)Undo方法:用于撤消文档的最后一次操作。

  3.Bookmark对象

  该对象是Bookmarks集合中的元素,代表文档中的书签。通过“Bookmarks( index )”的语法可获取Bookmark对象,其中index参数代表书签名称或索引号。

  (1)Select方法:用于选择指定的书签。

  (2)Delete方法:用于删除指定的书签。

  4.Field对象

  该对象是Fields集合中的元素,代表文档中的域。通过“Fields(index) ”的语法可获取Field对象。

  5.Template对象

  该对象是Templates集合中的元素,代表文档模板。通过“Templates(index)”的语法可获取Template对象。

  6.FontNames对象

  该对象代表有效的字体名称列表。通过FontNames、LandscapeFontNames 或 PortraitFontNames属性可获取FontNames对象。

  7.Options对象

  该对象代表 Word 的应用程序和文档选项。

  8.AutoTextEntries集合对象和AutoTextEntry对象

  AutoTextEntries集合对象由AutoTextEntry对象组成,代表模板中所有的“自动图文集”词条。AutoTextEntry对象代表单一的“自动图文集”词条。

  Insert方法:用于在指定的范围中通过插入“自动图文集”词条的方式来替换原内容。

  9.Selection对象

  该对象代表当前文档的选择内容,可为区域或插入点,每个文档仅有一个 Selection对象,且任意时刻仅可激活一个Selection对象,通过Selection属性可获取Selection对象。

  (1)Text属性:返回或设置所选内容中的文本。

  (2)Copy方法:将指定对象复制到剪贴板。

  (3)Paste方法:将剪贴板内容粘贴至选择区域。

  (4)TypeParagraph方法:用于插入新段落,等同于在编辑时按回车键。

  (5)TypeText方法:用于插入指定的文本。

  (6)WholeStory方法:用于扩展选择内容,并包含整个文字部分。

  (7)GoTo方法:将插入点移至指定位置。

  (8)HomeKey方法:等同于按下“Home”键。

  (9)EndKey方法:等同于按下“End”键。

  (二)Excel 2002开发对象
  1.Application对象

  该对象代表Excel应用程序,通过该对象可访问Excel中的其他所有对象。

  (1)ActiveCell属性:返回Range对象,代表活动窗口或指定窗口的活动单元格。

  (2)ActiveChart属性:返回Chart对象,代表活动图表。

  (3)ActiveSheet属性:返回WorkSheet对象,代表活动工作簿中的活动工作表。

  (4)ActiveWorkbook属性:返回Workbook对象,代表活动的工作簿。

  (5)Cells属性:返回 Range对象,代表活动工作簿中所有单元格。

  (6)Charts属性:返回Sheets集合,代表活动工作簿中所有图表。

  (7)Range属性:返回Range对象,代表单元格或单元格区域。

  (8)Sheets属性:返回Sheets集合,代表当前工作簿的所有工作表。

  (9)StatusBar属性:返回状态栏的文本。

  (10)Workbooks属性:返回Workbooks集合,代表所有打开的工作簿。

  (11)Worksheets属性:返回Sheets集合,代表活动工作簿的所有工作表。

  (12)Calculate方法:用于对指定区域的单元格进行计算。

  (13)Evaluate方法:用于将字符串的值进行转义操作,即可将以字符串表示的运算式进行求解的操作。

  (14)InputBox方法:用于显示接收输入的对话框,并返回对话框中输入的信息。

  (15)Quit方法:用于退出Excel应用程序。

  2.AddIn对象

  该对象代表加载宏,通过“AddIns(index)”语法可返回AddIn对象,其中index参数为加载宏标题或编号。

  FullName属性:返回加载宏的文件名。

  3.Chart对象

  该对象代表工作簿中的图表,包括嵌入式图表和单独的图表。

  (1)ChartArea属性:返回ChartArea对象,代表指定图表中的全部图表区域。

  (2)ChartTitle属性:返回ChartTitle对象,代表指定图表的标题。

  (3)ChartType属性:返回或设置图表的类型。

  (4)DataTable属性:返回DataTable对象,代表图表数据表。

  (5)Walls属性:返回Walls对象,代表三维图表的背景墙。

  4.Workbook对象

  该对象代表工作簿。

  (1)Styles属性:返回Styles集合,代表指定工作簿的所有样式。

  (2)Add方法:用于新建工作簿,并将其设置为活动工作簿。

  (3)Open方法:用于打开工作簿。

  (4)OpenText方法:用于载入文本文件,并将其进行分列处理,然后在工作表中插入经过分列处理的文本数据。

  5.Worksheet对象

  该对象代表工作表,通过“Worksheets(index)”的语法可获取Worksheet对象,其中index参数工作表索引号或名称。

  (1)AutoFilter属性:用于设置是否进行筛选。

  (2)UsedRange属性:返回Range对象,代表指定工作表中的已用区域。

  (3)PrintOut方法:用于打印指定的对象。

  (4)PrintPreview方法:将切换之打印预览视图。

  (5)Select方法:用于选择指定的对象。

  6.Range对象

  该对象代表选择区域,是Excel开发中一个常用的对象。

  (1)Address属性:返回对指定区域的引用名称。

  (2)Areas属性:返回Areas集合,代表多重选择区域中的所有区域。

  (3)Column属性:返回第一块指定区域中的第一列的序号。

  (4)Columns属性:返回Range对象,代表指定区域中的所有列。

  (5)ColumnWidth属性:返回或设置指定区域中所有列的列宽。

  (6)Formula属性:用于设置Range对象使用的公式。

  (7)MergeArea属性:返回Range对象,代表指定单元格的合并范围。

  (8)MergeCells属性:返回区域中是否包含合并单元格。

  (9)NumberFormat属性:返回或设置指定对象的格式代码。

  (10)Row属性:返回第一块指定区域中的第一行的序号。

  (11)Rows属性:返回Range对象,代表指定区域中的所有行。

  (12)Activate方法:用于激活对象。

  (13)ApplyNames方法:用于将名称应用于指定的单元格。

  (14)AutoFill方法:用于对指定的单元格进行自动填充。

  (15)AutoFit方法:用于将列宽和行高调整为适当值。

  (16)Find方法:用于在区域内查找特定信息,并返回代表第一个包含所查找信息的单元格。

  (17)Merge方法:用于从指定的Range对象中创建合并单元格。

  (18)Replace方法:用于在指定区域内查找和替换。

  (19)Subtotal方法:用于创建指定区域内的分类汇总。

  (三)PowerPoint 2002开发对象
  1.Application对象

  该对象代表PowerPoint应用程序,通过该对象可访问PowerPoint中的其他所有对象。

  (1)Active属性:返回指定窗格是否被激活。

  (2)ActivePresentation属性:返回Presentation对象,代表活动窗口中打开的演示文稿。

  (3)ActiveWindow属性:返回DocumentWindow对象,代表当前文档窗口。

  (4)Presentations属性:返回Presentations集合,代表所有打开的演示文稿。

  (5)SlideShowWindows属性:返回 SlideShowWindows集合,代表所有打开的幻灯片放映窗口。

  (6)Quit方法:用于退出PowerPoint程序。

  2.DocumentWindow对象

  该对象代表文档窗口。使用“Windows(index) ”语法可返回DocumentWindow对象。

  (1)ActivePane属性:返回Pane对象,代表文档窗口中的活动窗格。

  (2)Panes属性:返回Panes集合,代表文档窗口中的所有窗格。

  (3)ViewType属性:返回指定的文档窗口内的视图类型。

  3.Presentation对象

  该对象代表演示文稿,通过“Presentations(index)”语法可返回Presentation对象。

  (1)BuiltInDocumentProperties属性:返回DocumentProperties集合,代表演示文稿的所有文档属性。

  (2)ColorSchemes属性:返回ColorSchemes 集合,代表演示文稿的配色方案。

  (3)PageSetup属性:返回PageSetup对象,用于控制演示文稿的幻灯片页面设置属性。

  (4)SlideMaster属性:返回幻灯片母版对象。

  (5)SlideShowSettings属性:返回SlideShowSettings对象,代表演示文稿的幻灯片放映设置。

  (6)SlideShowWindow属性:返回幻灯片放映窗口对象。

  (7)AddTitleMaster方法:为演示文稿添加标题母版。

  (8)ApplyTemplate方法:对演示文稿应用设计模板。

  4.SlideShowWindow对象

  该对象代表幻灯片放映窗口。

  IsFullScreen属性:用于设置是否全屏显示幻灯片放映窗口。

  5.Master对象

  该对象代表幻灯片母版、标题母版、讲义母版或备注母版。

  TextStyles属性:为幻灯片母版返回TextStyles 集合,代表标题文本、正文文本和默认文本。

  6.Slide对象

  该对象代表幻灯片。

  (1)SlideID属性:返回幻灯片的唯一标识符。

  (2)SlideIndex属性:返回幻灯片在Slides集合中的索引号。

  7.SlideShowView对象

  该对象代表幻灯片放映窗口中的视图。

  (1)AcceleratorsEnabled属性:用于设置是否允许在幻灯片放映时使用快捷键。

  (2)CurrentShowPosition属性:返回当前幻灯片在放映中的位置。

  (3)DrawLine方法:在指定幻灯片放映视图中绘制直线。

  (4)EraseDrawing方法:用于清除通过DrawLine方法或绘图笔工具在放映中绘制的直线。

  (5)GotoSlide方法:用于切换指定幻灯片。

  四、VBA综合开发实例温馨贺卡向导
  (一)例程分解
  本例程是一个简单的贺卡向导,可直接运行并可辅助生成简单的贺卡。程序主界面与Word的标准向导程序类似,单击“上一步”和“下一步”按钮或直接单击窗体左侧的切换按钮均可直接跳转至相应步骤。单击“取消”按钮将关闭向导窗体,如图4所示。

 

  单击“下一步”按钮切换至下一页,在该页面中可选择贺卡的节日并输入发送者和接受者的姓名,如图5所示。

 

  单击“下一步”按钮切换至下一页,在该页面中可输入贺词,如图6所示。

 

  单击“下一步”按钮切换至向导程序的末一页,单击“完成”按钮即可生成文档。生成的文档将包含将用户在前述步骤中填写的信息,生成一份简单的贺卡。

  (二)程序知识点
  1.向导的编制原理

  向导程序的本质即前述的Word模板文件(DOT文件),唯一区别在于其扩展名为“WIZ”,因此编制向导程序首先需编制模板并调试代码,在调试无误后将扩展名改为“WIZ”即可。向导编制的常规步骤如下所述:

  (1)创建向导所需的自动图文集:向导所需的自动图文集是包含书签的自动图文集,最后生成文档时即调用了预保存的图文集,而在Word中用于定位的书签对象,可在需填写输入内容的位置上帮助程序实现定位并替换。该步骤是编制向导程序的关键。

  (2)编辑窗体和模块:向导程序需通过窗体来实现交互功能,因此通过合理运用控件,完全可设计出美观易用的窗体,然后对窗体的控件进行事件编程,实现流程控制。窗体设计完毕后,需通过模块来保存通用的功能,常用的功能包含生成文档、替换书签和删除书签等。

  (3)设置向导程序入口:向导程序需通过特定的事件来触发,建议在“ThisDocument”对象的“New”事件中输入调用向导程序入口的代码。Document对象的事件包括New事件(在创建基于模板的文档时触发。按功能分析,向导程序入口即通过该事件执行)、Open 事件(在打开文档时触发)和Close事件(在关闭文档时触发)。

  2.界面设计知识点

  (1)向导程序需逐步引导用户,因此建议使用多页控件(MultiPage)实现界面切换。

  (2)VBA的窗体设计中未提供类似VB的控件数组功能,因此需访问Controls集合对象来控制一些外观和功能均类似的控件。

  (3)由于从前述知识点可得向导程序本质为模板文件,因此开发者可直接打开Word已提供的向导程序(如“实用文体向导”等),然后通过工程资源管理器导出其界面窗体,然后在此基础上进行参考和修改,可大大提高编制的效率。

  (4)Controls集合:窗体的Controls集合代表其包含的全部控件。Controls集合中的每个控件均有唯一的索引,也可通过控件名称来引用。在向导程序中,为有效地控制功能和外观均类似的控件(如切换按钮),可通过名称引用来枚举访问窗体的Controls集合,即可控制这些控件。

  (5)多页控件:多页控件(MultiPage)是Pages集合的容器,每个多页控件均包含一个或多个Page对象,其常用属性和方法如下:

  Value属性:为多页控件默认属性,返回当前活动页面的索引号,从“0”开始编号,依此类推。

  Style属性:用于设置多页控件标签的显示风格,在向导中建议设置为“2”(即不显示表头)。

  (6)Page对象:该对象代表多页控件的页面。每个 Page对象均可放置不同的控件,以实现多界面切换的效果,第一个Page对象默认名称为“Page1”,其常用属性和方法如下:

  Picture属性:用于设置页面的背景图片。

  PictureTiling属性:用于设置是否平铺图片。

  PictureSizeMode属性:用于设置显示背景图片的方式。

  (三)程序实现步骤
  1.创建向导所需的自动图文集

  通过前述内容可得创建向导所需的自动图文集是关键的步骤,因此首先在编辑界面中输入相关的文字,然后在需插入内容的位置添加书签,最后选择全部内容,以“hk”命名并保存于模板的自动图文集中。如图7所示:

 

  2.编制窗体

  在VBA编辑器的工程资源管理器中添加窗体,放置多页控件、标签、文本框、列表框等控件(也可采用前述的导入并修改的方法来设计窗体),由于该窗体使用的控件较多,限于篇幅,不在逐一介绍,可按效果图自行设计,本文仅对一些需在代码中使用的控件进行介绍。

  首先切换至多页控件的第二页,该页面中需编程的控件位置和名称如图8所示:

 

  如图8所示,其中“frmHKWiz”为用户窗体,“Page1”为多页控件的页面对象,“txtfsz”和“txtjsz”均为文本框控件,“shpMap0”至“shpMap3”、“lblMap0”至“lblMap3”均为Label控件,“lstjr”为列表框控件。切换至多页控件的第三页,该页面中需编程的控件位置和名称如图9所示:

 

  如图9所示,其中“Page2”为多页控件的页面对象,“shpChartPath”为标签控件,“txthc”为文本框控件,“cmdCancel”、“cmdBack”、“cmdNext”和“cmdFinish”均为命令按钮控件。

  窗体界面设计完毕后,切换至代码编辑窗口,首先输入常量声明,代码如下所示:

  '代表页面数量

  Const P_Count = "3"

  '标签名称的常量

  Const Const_LBL = "lblMap"

  '标签名称的常量

  Const Const_SHP = "shpMap"

  然后输入公共变量,代码如下所示:

  '用于保存当前页面编号的变量

  Dim indexPanel As Integer

  输入自定义的过程代码,如下所示:

  '初始化控件的过程

  Private Sub init_Controls()

  With lstjr

  .AddItem "圣诞节"

  .AddItem "中秋节"

  .AddItem "国庆节"

  End With

  End Sub

  '切换页面的过程

  Private Sub changepage(iNewPanel As Integer)

  If indexPanel = iNewPanel Or fWizardCallBack Then

  Exit Sub

  End If

  '通过Controls集合对象来实现页面切换效果

  frmHKWiz.Controls(Const_SHP & indexPanel).BackColor = vbWhite

  frmHKWiz.Controls(Const_LBL & indexPanel).FONTBOLD = False

  indexPanel = iNewPanel

  frmHKWiz.Controls(Const_SHP & indexPanel).BackColor = vbGreen

  frmHKWiz.Controls(Const_LBL & indexPanel).FONTBOLD = True

  mpgWizardPage.Value = indexPanel

  End Sub

  最后输入各控件的事件代码,如下所示:

  '用于模拟切换按钮的标签单击事件

  Private Sub lblMap0_Click()

  changepage (0)

  End Sub

  Private Sub lblMap1_Click()

  changepage (1)

  End Sub

  Private Sub lblMap2_Click()

  changepage (2)

  End Sub

  Private Sub lblMap3_Click()

  changepage (3)

  End Sub

  Private Sub shpMap0_Click()

  changepage (0)

  End Sub

  Private Sub shpMap1_Click()

  changepage (1)

  End Sub

  Private Sub shpMap2_Click()

  changepage (2)

  End Sub

  Private Sub shpMap3_Click()

  changepage (3)

  End Sub

  Private Sub shpMap4_Click()

  changepage (4)

  End Sub

  '“上一步”按钮单击事件

  Private Sub cmdBack_Click()

  If indexPanel > 0 Then

  changepage (indexPanel - 1)

  End If

  End Sub

  '“下一步”按钮单击事件

  Private Sub cmdNext_Click()

  If indexPanel < P_Count Then

  changepage (indexPanel + 1)

  End If

  End Sub

  '“取消”按钮单击事件

  Private Sub cmdCancel_Click()

  '关闭窗体

  Unload Me

  End Sub

  '“完成”按钮单击事件

  Private Sub cmdFinish_Click()

  Application.ScreenUpdating = False

  '调用模块中创建文档的过程,即窗体和模块的接口过程

  CreateNewDoc (True)

  End Sub

  '窗体初始化事件

  Private Sub UserForm_Initialize()

  indexPanel = 0

  mpgWizardPage.Value = 0

  changepage (0)

  init_Controls

  End Sub

  3.编制模块

  模块用于保存向导程序中公用的代码,在工程资源管理器中添加标准模块,命名为“Common”,然后输入代码(也可模仿窗体的导入操作,将Word提供的向导程序包含的模块导入,参考并使用其中的很多过程),如下所示:

  '启动向导,即向导程序的入口

  Public Sub StartWizard()

  '显示窗体

  frmHKWiz.Show

  End Sub

  '创建新文档的过程,通过“fDummy”参数可使该Public类型的过程不在Word的“宏”列表中出现。

  Public Sub CreateNewDoc(fDummy As Boolean)

  Application.ScreenUpdating = False

  '设置鼠标为“等待”形状

  System.Cursor = wdCursorWait

  '获取向导程序的模板

  Set objWizTemplate = ActiveDocument.AttachedTemplate

  Application.DisplayAutoCompleteTips = True

  '插入已创建的自动图文集

  ActiveDocument.AttachedTemplate.AutoTextEntries("hk").Insert Selection.Range, True

  ActiveDocument.Select

  '调用替换书签的过程,将窗体中输入的内容在文档中进行替换

  ReplaceBookmark "jr", frmHKWiz.lstjr.Text

  ReplaceBookmark "fsz", frmHKWiz.txtfsz.Text

  ReplaceBookmark "jsz", frmHKWiz.txtjsz.Text

  ReplaceBookmark "hc", frmHKWiz.txthc.Text

  '设置新文档的属性

  With ActiveDocument

  .SpellingChecked = True

  .GrammarChecked = True

  .UndoClear

  End With

  Application.DisplayAutoCompleteTips = True

  Selection.HomeKey wdStory

  '恢复默认鼠标形状

  System.Cursor = wdCursorNormal

  Application.ScreenUpdating = True

  '关闭窗体

  Unload frmHKWiz

  '调用删除所有书签的过程

  deleteallbookmark

  End Sub

  '替换书签内容的过程

  Private Sub ReplaceBookmark(which As String, what As String)

  If Len(what) = 0 Then

  what = ""

  End If

  '选择指定的书签

  Selection.GoTo what:=wdGoToBookmark, Name:=which

  '替换内容

  Selection.TypeText what

  End Sub

  '删除所有书签的过程

  Private Sub deleteallbookmark()

  Dim bm As Bookmark

  '遍历所有的书签

  For Each bm In ActiveDocument.Bookmarks

  '删除书签

  bm.Delete

  Next

  End Sub

  4.设置向导入口

  代码编写完毕后,在工程资源管理器中切换至“ThisDocument”对象,输入事件代码,如下所示:

  Private Sub Document_New()

  '调用模块(Common)中启动向导的过程

  Common.StartWizard

  End Sub

  5.后续工作

  向导程序编制、调试无误后,可将其扩展名改为“WIZ”,然后搜索“Normal.dot”文件所在的文件夹,并将该向导程序放置于该目录,随后启动Word XP后即可在“模板”窗体的“常用”栏中显示该向导的图标。

posted on 2008-06-17 08:47  曾伟  阅读(4366)  评论(2编辑  收藏  举报

导航