2005年07月03日
Java中ThreadLocal的设计与使用
作者佚名 来源InterNet 加入时间:2005-1-28
早在Java 1.2推出之时,Java平台中就引入了一个新的支持:java.lang.ThreadLocal,给我们在编写多线程程序时提供了一种新的选择。使用这个工具类可以很简洁地编写出优美的多线程程序,虽然ThreadLocal非常有用,但是似乎现在了解它、使用它的朋友还不多。

   ThreadLocal是什么

   ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。线程局部变量并不是Java的新发明,在其它的一些语言编译器实现(如IBM XL FORTRAN)中,它在语言的层次提供了直接的支持。因为Java中没有提供在语言层次的直接支持,而是提供了一个ThreadLocal的类来提供支持,所以,在Java中编写线程局部变量的代码相对比较笨拙,这也许是线程局部变量没有在Java中得到很好的普及的一个原因吧。

   ThreadLocal的设计

   首先看看ThreadLocal的接口:

    Object get() ; // 返回当前线程的线程局部变量副本 protected Object initialValue(); // 返回该线程局部变量的当前线程的初始值
    void set(Object value); // 设置当前线程的线程局部变量副本的值

   ThreadLocal有3个方法,其中值得注意的是initialValue(),该方法是一个protected的方法,显然是为了子类重写而特意实现的。该方法返回当前线程在该线程局部变量的初始值,这个方法是一个延迟调用方法,在一个线程第1次调用get()或者set(Object)时才执行,并且仅执行1次。ThreadLocal中的确实实现直接返回一个null:


protected Object initialValue() { return null; }


  ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。比如下面的示例实现:


public class ThreadLocal
{
  private Map values = Collections.synchronizedMap(new HashMap());
  public Object get()
  {
   Thread curThread = Thread.currentThread();
   Object o = values.get(curThread);
   if (o == null && !values.containsKey(curThread))
   {
    o = initialValue();
    values.put(curThread, o);
   }
   return o;
  }

  public void set(Object newValue)
  {
   values.put(Thread.currentThread(), newValue);
  }

  public Object initialValue()
  {
   return null;
  }
}


  当然,这并不是一个工业强度的实现,但JDK中的ThreadLocal的实现总体思路也类似于此。

   ThreadLocal的使用

   如果希望线程局部变量初始化其它值,那么需要自己实现ThreadLocal的子类并重写该方法,通常使用一个内部匿名类对ThreadLocal进行子类化,比如下面的例子,SerialNum类为每一个类分配一个序号:


public class SerialNum
{
  // The next serial number to be assigned

  private static int nextSerialNum = 0;
  private static ThreadLocal serialNum = new ThreadLocal()
  {
   protected synchronized Object initialValue()
   {
    return new Integer(nextSerialNum++);
   }
  };

  public static int get()
  {
   return ((Integer) (serialNum.get())).intValue();
  }
}


  SerialNum类的使用将非常地简单,因为get()方法是static的,所以在需要获取当前线程的序号时,简单地调用:


int serial = SerialNum.get();


  即可。

   在线程是活动的并且ThreadLocal对象是可访问的时,该线程就持有一个到该线程局部变量副本的隐含引用,当该线程运行结束后,该线程拥有的所以线程局部变量的副本都将失效,并等待垃圾收集器收集。

   ThreadLocal与其它同步机制的比较

   ThreadLocal和其它同步机制相比有什么优势呢?ThreadLocal和其它所有的同步机制都是为了解决多线程中的对同一变量的访问冲突,在普通的同步机制中,是通过对象加锁来实现多个线程对同一变量的安全访问的。这时该变量是多个线程共享的,使用这种同步机制需要很细致地分析在什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放该对象的锁等等很多。所有这些都是因为多个线程共享了资源造成的。ThreadLocal就从另一个角度来解决多线程的并发访问,ThreadLocal会为每一个线程维护一个和该线程绑定的变量的副本,从而隔离了多个线程的数据,每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的整个变量封装进ThreadLocal,或者把该对象的特定于线程的状态封装进ThreadLocal。

   由于ThreadLocal中可以持有任何类型的对象,所以使用ThreadLocal get当前线程的值是需要进行强制类型转换。但随着新的Java版本(1.5)将模版的引入,新的支持模版参数的ThreadLocal<T>类将从中受益。也可以减少强制类型转换,并将一些错误检查提前到了编译期,将一定程度地简化ThreadLocal的使用。

   总结

   当然ThreadLocal并不能替代同步机制,两者面向的问题领域不同。同步机制是为了同步多个线程对相同资源的并发访问,是为了多个线程之间进行通信的有效方式;而ThreadLocal是隔离多个线程的数据共享,从根本上就不在多个线程之间共享资源(变量),这样当然不需要对多个线程进行同步了。所以,如果你需要进行多个线程之间进行通信,则使用同步机制;如果需要隔离多个线程之间的共享冲突,可以使用ThreadLocal,这将极大地简化你的程序,使程序更加易读、简洁。

2005年06月30日

很多人用java进行文档操作时经常会遇到一个问题,就是如何获得word,excel,pdf等文档的内容?我研究了一下,在这里总结一下抽取word,pdf的几种方法。
1 .用jacob
其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。

jacob jar与dll文件下载: http://www.matrix.org.cn/down_view.asp?id=13

下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子:

import java.io.File;
import com.jacob.com.*;
import com.jacob.activeX.*;
/**
* Title: pdf extraction
* Description: email:chris@matrix.org.cn
* Copyright: Matrix Copyright 2003
* Company: Matrix.org.cn
* @author chris
* @version 1.0,who use this example pls remain the declare
*/
public class FileExtracter{
public static void main(String[] args) {
ActiveXComponent component = new ActiveXComponent("Word.Application");
String inFile = "c:\\test.doc";
String tpFile = "c:\\temp.htm";
String otFile = "c:\\temp.xml";
boolean flag = false;
try {
component.setProperty("Visible", new Variant(false));
Object wordacc = component.getProperty("document.").toDispatch();
Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method,
new Object[]{inFile,new Variant(false), new Variant(true)},
new int[1] ).toDispatch();
Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant}, new int[1]);
Variant f = new Variant(false);
Dispatch.call(wordfile, "Close", f);
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
component.invoke("Quit", new Variant[] {});
}
}
}



2. 用apache的poi来抽取word,excel。
poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你:

下载经过封装后的poi包: http://www.matrix.org.cn/down_view.asp?id=14

下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子:

import java.io.*;
import org.textmining.text.extraction.WordExtractor;
/**
*

Title: word extraction


*

Description: email:chris@matrix.org.cn


*

Copyright: Matrix Copyright 2003


*

Company: Matrix.org.cn


* @author chris
* @version 1.0,who use this example pls remain the declare
*/

public class PdfExtractor {
public PdfExtractor() {
}
public static void main(String args[]) throws Exception
{
FileInputStream in = new FileInputStream ("c:\\a.doc");
WordExtractor extractor = new WordExtractor();
String str = extractor.extractText(in);
System.out.println("the result length is"+str.length());
System.out.println("the result is"+str);
}
}



3. pdfbox-用来抽取pdf文件
但是pdfbox对中文支持还不好,先下载pdfbox: http://www.matrix.org.cn/down_view.asp?id=12

下面是一个如何使用pdfbox抽取pdf文件的例子:

import org.pdfbox.pdmodel.PDdocument.
import org.pdfbox.pdfparser.PDFParser;
import java.io.*;
import org.pdfbox.util.PDFTextStripper;
import java.util.Date;
/**
*

Title: pdf extraction


*

Description: email:chris@matrix.org.cn


*

Copyright: Matrix Copyright 2003


*

Company: Matrix.org.cn


* @author chris
* @version 1.0,who use this example pls remain the declare
*/

public class PdfExtracter{

public PdfExtracter(){
}
public String GetTextFromPdf(String filename) throws Exception
{
String temp=null;
PDdocument.nbsppdfdocument.null;
FileInputStream is=new FileInputStream(filename);
PDFParser parser = new PDFParser( is );
parser.parse();
pdfdocument.nbsp= parser.getPDdocument.);
ByteArrayOutputStream out = new ByteArrayOutputStream();
OutputStreamWriter writer = new OutputStreamWriter( out );
PDFTextStripper stripper = new PDFTextStripper();
stripper.writeText(pdfdocument.getdocument.), writer );
writer.close();
byte[] contents = out.toByteArray();

String ts=new String(contents);
System.out.println("the string length is"+contents.length+"\n");
return ts;
}
public static void main(String args[])
{
PdfExtracter pf=new PdfExtracter();
PDdocument.nbsppdfdocument.nbsp= null;

try{
String ts=pf.GetTextFromPdf("c:\\a.pdf");
System.out.println(ts);
}
catch(Exception e)
{
e.printStackTrace();
}
}

}



4. 抽取支持中文的pdf文件-xpdf
xpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。

下载xpdf函数包: http://www.matrix.org.cn/down_view.asp?id=15

同时需要下载支持中文的补丁包: http://www.matrix.org.cn/down_view.asp?id=16

按照readme放好中文的patch,就可以开始写调用本地方法的java程序了

下面是一个如何调用的例子:

import java.io.*;
/**
*

Title: pdf extraction


*

Description: email:chris@matrix.org.cn


*

Copyright: Matrix Copyright 2003


*

Company: Matrix.org.cn


* @author chris
* @version 1.0,who use this example pls remain the declare
*/

public class PdfWin {
public PdfWin() {
}
public static void main(String args[]) throws Exception
{
String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";
String filename="c:\\a.pdf";
String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};
Process p = Runtime.getRuntime().exec(cmd);
BufferedInputStream bis = new BufferedInputStream(p.getInputStream());
InputStreamReader reader = new InputStreamReader(bis, "UTF-8");
StringWriter out = new StringWriter();
char [] buf = new char[10000];
int len;
while((len = reader.read(buf))>= 0) {
//out.write(buf, 0, len);
System.out.println("the length is"+len);
}
reader.close();
String ts=new String(buf);
System.out.println("the str is"+ts);
}
}



关于作者
作者简介:chris,毕业于中国人民大学信息学院。现于香港进行金融分析软件研发,作者亦活跃于 jxta p2p开源软件的开发社区,并热衷于网络安全,AI搜索引擎技术与基于java的游戏引擎技术。
如果大家谁有更好的办法,请告诉作者 : chris@matrix.org.cn

 
1、  下载JACOB包:http://danadler.com/jacob/

2、  安装配置

解压jacobBin_17.zip

(1)jacob.dll所在目录放到PATH中

(2)jacob.jar放到CLASSPATH中

3、使用jacob进行Excel控制,下面是我写的一个测试程序代码

 

import com.jacob.com.*;
import com.jacob.activeX.*;

class ExcelTest
{
  private static ActiveXComponent xl;
  private static Object workbooks = null;
  private static Object workbook = null;
  private static Object sheet = null;
  private static String filename =null;
  private static boolean readonly = false;
 
  public static void main(String[] args)
  {
     String file = "f:\\java\\test.xls";
     OpenExcel(file,false);//false为不显示打开Excel
     SetValue("A1","Value","2");
     System.out.println(GetValue("A3"));
     CloseExcel(false);
  }
 
  //打开Excel文档
  private static void OpenExcel(String file,boolean f)
  {
    try
    {
        filename = file;
        xl = new ActiveXComponent("Excel.Application");
        xl.setProperty("Visible", new Variant(f));
        workbooks = xl.getProperty("Workbooks").toDispatch();
         workbook = Dispatch.invoke(workbooks,
                "Open",
                Dispatch.Method,
                                    new Object[]{filename,
                                    new Variant(false),
                                    new Variant(readonly)},//是否以只读方式打开
                                    new int[1] ).toDispatch();
    }catch(Exception e)
    {e.printStackTrace();}
  }
 
  //关闭Excel文档
  private static void CloseExcel(boolean f)
  {
   try
   {  
     Dispatch.call(workbook,"Save");
         Dispatch.call(workbook, "Close", new Variant(f));
      } catch (Exception e) {
         e.printStackTrace();
     } finally {
     xl.invoke("Quit", new Variant[] {});
      }
  }
 
  //写入值
  private static void SetValue(String position,String type,String value)
  {
     sheet = Dispatch.get(workbook,"ActiveSheet").toDispatch();
     Object cell = Dispatch.invoke(sheet, "Range",
             Dispatch.Get,
                                    new Object[] {position},
                                    new int[1]).toDispatch();
      Dispatch.put(cell, type, value);
  }

  //读取值 
  private static String GetValue(String position)
  {
    Object cell = Dispatch.invoke(sheet,"Range",Dispatch.Get,new Object[] {position},new int[1]).toDispatch();
  String value = Dispatch.get(cell,"Value").toString();
 
  return value;
  }
}

 
 
 
 

  jcob的原理是通过一个接口来操作word的activex对象。现在的版本是1.9。
首先:把jcob.dll拷贝到system32目录下。
其次:把jcob.jar的路径放置在classpath目录下。
最后:编写访问类。


  public static void main(String[] args) {
    //启动word,生成一个ActivexComponent对象
    ActiveXComponent app = new ActiveXComponent("Word.Application");
    //要转换的word文件
    String inFile = "D:\\project\\java_word\\java_word\\wordtemplet.doc";
    //要报存的目标文件
    String tpFile ="D:\\project\\java_word\\java_word\\wordtemplet3.doc";
    boolean flag = false;
    Dispatch xlo = app.getObject();
    String oldText="1234";
    String newText="test";
    boolean visible=false;
    String bookMarkKey="LB_KJGG";
    try {
      //设置word不可见
      app.setProperty("Visible", new Variant(visible));
      //log.info("设置word不可见成功!");
      System.out.println("设置word不可见成功!");
      Dispatch docs = app.getProperty("Documents").toDispatch();
      Dispatch doc = Dispatch.invoke(docs, "Open", Dispatch.Method
                                   ,new Object[]
                                   {inFile, new Variant(false), new Variant(true)}
                                   , new int[1]).toDispatch(); //打开word文件
      //在word2003的vba文档中application有UserName属性。
      String userName=app.getPropertyAsString("UserName");
      System.out.println("用户名:"+userName);
      Dispatch selection=app.getProperty("Selection").toDispatch();
      //得到一个组件
      System.out.println("Selection");
      Dispatch find = app.call(selection, "Find").toDispatch();

       //查找什么文本
       Dispatch.put(find, "Text", oldText);
       //替换文本
       Dispatch.call(find,"ClearFormatting");
       Dispatch.put(find, "Text", oldText);
       Dispatch.call(find, "Execute");
       Dispatch.put(selection, "Text", newText);
       // Dispatch.call(app, "SaveAs", inFile);
       System.out.println("replace");
      
       //把指定的值设置到指定的标签中去
       Dispatch activeDocument=app.getProperty("ActiveDocument").toDispatch();
       System.out.println("activedocument");
       Dispatch bookMarks = app.call(activeDocument, "Bookmarks").toDispatch();
       System.out.println("bookmarks");
       boolean bookMarkExist1=Dispatch.call(bookMarks,"Exists",bookMarkKey).toBoolean();
       if(bookMarkExist1==true){
         System.out.println("exists bookmark!");
         Dispatch rangeItem = Dispatch.call(bookMarks, "Item",bookMarkKey).
                        toDispatch();
                    System.out.println("range item!");
                    Dispatch range = Dispatch.call(rangeItem, "Range").toDispatch();
                    System.out.println("range !");
                    //取标签的值
                    String bookMarkValue=Dispatch.get(range,"Text").toString();
                    bookMarkValue="test";
                    if(bookMarkValue!=null){
                      Dispatch.put(range, "Text",
                             new Variant(bookMarkValue));
                    }
        
       }
       else{
         System.out.println("not exists bookmark!");
       }
      //保存文件
      Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {tpFile, new Variant(0)}                      , new int[1]);
      //作为word格式保存到目标文件
      Variant f = new Variant(false);
      Dispatch.call(doc, "Close", f);
      flag = true;
    }
    catch (Exception e) {
      e.printStackTrace();
    }
    finally {
      app.invoke("Quit", new Variant[] {});
    }


2005年06月29日


我这两天试着用java把word文档转换为htm文档,现已搞定,经验如下:

1.下载jacob_18.zip:打开网址:http://sourceforge.net/projects/jacob-project/,然后点击[View ALL Project Files] ,里面有jacob的1.8版本下载;

2.解压jacob_18.zip,将jacob.jar放在“JAVA_HOME\jre\lib\ext\”目录下(“JAVA_HOME”为你所安装的JDK目录),例如“C:\java\jre\lib\ext\”,将jacob.dll放在目录“C:\jacob\”下;

3.设置path:右击“我的电脑” –> 选择“高级” –> 点击“环境变量” –> 在“系统变量”中双击变量“path”,在后边加上“C:\jacob;”,点击“确定”;

4.编写程序(文件名为WordToHtm.java):
/**
 * File Name : WordToHtm
 * Author :
 * Date : 2005.4.26
 * Note : convert word file to htm file.
 */

import java.io.File;
import com.jacob.com.*;
import com.jacob.activeX.*;

public class WordToHtm
{
 public static void main( String[] args )
 {
  //启动word
  ActiveXComponent app = new ActiveXComponent( "Word.Application" );
 
  //要转换的word文件
  String inFile = "D:\\test\\my.doc";
 
  //目标文件
  String tpFile = "D:\\test\\my.htm";
 
  boolean flag = false;
 
  try
  {
   //设置word不可见
   app.setProperty( "Visible", new Variant(false) );
  
   Object docs = app.getProperty( "Documents" ).toDispatch();
  
   //打开word文件
   Object doc = Dispatch.invoke(
    docs ,
    "Open" ,
    Dispatch.Method ,
    new Object[]
    {
     inFile ,
     new Variant(false) ,
     new Variant(true)
    } ,
    new int[1]
          ).toDispatch();
  
   //作为html格式保存到临时文件
   Dispatch.invoke(
    doc ,
    "SaveAs" ,
    Dispatch.Method ,
    new Object[]
    {
     tpFile,new Variant( 8 )
    } ,
    new int[1]
         );
  
   Variant f = new Variant( false );
   Dispatch.call( doc , "Close" , f );
   flag = true;
  }
  catch( Exception e )
  {
   e.printStackTrace();
  }
  finally
  {
   app.invoke( "Quit" , new Variant[]{} );
  }
 }
}

5.将word文件my.doc放置在“D:\test\”目录下;

6.编译WordToHtm.java并运行后,你就会发现在“D:\test\”目录下出现了my.htm文件。

附注:

1.我使用的操作系统是windowXP,其它的系统我没有试过;

2.我使用的word的版本是microsoft @ word 2002,如果是更新的版本有可能会不成功(这我也没试过);

3.我所使用的jacob的版本是1.8,如果使用1.7或1.6版本则会出错,使用1.9版本也不行,编译不会成功,也许是因为1.9还处于开发阶段,尚不完善。


前一段时间为这个问题头疼的不得了,后来查阅了资料终于解决了;现将程序放出,以便以后参考。


//——————————————————————————
//版权所有 (C) 浪潮集团商用系统有限公司  保留所有权利
//文件名称: wordtohtml           文件版本: 1.00.00
//作    者: 郭铸     作者邮箱: guozhu@langchao.com  完成日期: 2004-10-20
//文件描述:
//其它描述:
//类 列 表:
//  wordtohtml: 将指定目录下面所有的doc文件转化为HTML并存储在相同目录下
//修改历史:
//  #   版本     修改日期    作者                 修改内容
//  —————————————————————————-
//  1   1.00.01  2004-10-14  作者姓名             修改内容描述
//  —————————————————————————-
//——————————————————————————
import com.jacob.com.*;
import com.jacob.activeX.*;
import java.io.*;

//取得指定目录下面所有的doc文件名称
public class wordtohtml
{
//——————————————————————————
//方法原型: change(String paths)
//功能描述: 将指定目录下面所有的doc文件转化为HTML并存储在相同目录下
//输入参数: String
//输出参数: 无
//返 回 值: 无
//其它说明: 递归
//——————————————————————————
 public static void change(String paths, String savepaths)
 {
  
  File d = new File(paths);
  //取得当前文件夹下所有文件和目录的列表
  File lists[] = d.listFiles();
  String pathss = new String("");

  //对当前目录下面所有文件进行检索
  for(int i = 0; i < lists.length; i ++)
  {
   if(lists[i].isFile())
   {
    String filename = lists[i].getName();
    String filetype = new String("");
    //取得文件类型
    filetype = filename.substring((filename.length() – 3), filename.length());
   
    //判断是否为doc文件
    if(filetype.equals("doc"))
    {
     System.out.println("当前正在转换……");
     //打印当前目录路径
     System.out.println(paths);
     //打印doc文件名
     System.out.println(filename.substring(0, (filename.length() – 4)));
    
     ActiveXComponent app = new ActiveXComponent("Word.Application");//启动word
    
     String docpath = paths + filename;
     String htmlpath = savepaths + filename.substring(0, (filename.length() – 4));
    
     String inFile = docpath;
    //要转换的word文件
     String tpFile = htmlpath;
    //HTML文件

     boolean flag = false;
    
     try
     {
      app.setProperty("Visible", new Variant(false));
        //设置word不可见
      Object docs = app.getProperty("Documents").toDispatch();
      Object doc = Dispatch.invoke(docs,"Open", Dispatch.Method, new Object[]{inFile,new Variant(false), new Variant(true)}, new int[1]).toDispatch();
        //打开word文件
      Dispatch.invoke(doc,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);
        //作为html格式保存到临时文件
      Variant f = new Variant(false);
      Dispatch.call(doc, "Close", f);
      flag = true;
     }
     catch (Exception e)
     {
      e.printStackTrace();
     }
     finally
     {
      app.invoke("Quit", new Variant[] {});
     }
     System.out.println("转化完毕!");
    }
   }
   else
   {
    pathss = paths;
    //进入下一级目录
    pathss = pathss + lists[i].getName() + "\\";   
    //递归遍历所有目录
    change(pathss, savepaths);
   }
  }
 
 }
//——————————————————————————
//方法原型: main(String[] args)
//功能描述: main文件
//输入参数: 无
//输出参数: 无
//返 回 值: 无
//其它说明: 无
//—————————————————————————— 
 public static void main(String[] args)
 {
 
  String paths = new String("D:\\Work\\2004.10.8\\test system\\test01\\word\\");
  String savepaths = new String ("D:\\Work\\2004.10.8\\test system\\test01\\html\\");

  change(paths, savepaths);

 }
}

其中import的jar包是一个开源的东东,网上搜索即得。
Dispatch.invoke(doc,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);
修改Variant(8)},里面得参数即可将Word转化为各种类型。

2005年06月28日

Unicode:

unicode.org制定的编码机制, 要将全世界常用文字都函括进去.
在1.0中是16位编码, 由U+0000到U+FFFF. 每个2byte码对应一个字符; 在2.0开始抛弃了16位限制, 原来的16位作为基本位平面, 另外增加了16个位平面, 相当于20位编码, 编码范围0到0×10FFFF.

UCS:

ISO制定的ISO10646标准所定义的 Universal Character Set, 采用4byte编码.

Unicode与UCS的关系:

ISO与unicode.org是两个不同的组织, 因此最初制定了不同的标准; 但自从unicode2.0开始, unicode采用了与ISO 10646-1相同的字库和字码, ISO也承诺ISO10646将不会给超出0×10FFFF的UCS-4编码赋值, 使得两者保持一致.

UCS的编码方式:



UCS-2, 与unicode的2byte编码基本一样.

UCS-4, 4byte编码, 目前是在UCS-2前加上2个全零的byte.

UTF: Unicode/UCS Transformation Format

UTF-8, 8bit编码, ASCII不作变换, 其他字符做变长编码, 每个字符1-3 byte. 通常作为外码. 有以下优点:
* 与CPU字节顺序无关, 可以在不同平台之间交流
* 容错能力高, 任何一个字节损坏后, 最多只会导致一个编码码位损失, 不会链锁错误(如GB码错一个字节就会整行乱码)

UTF-16, 16bit编码, 是变长码, 大致相当于20位编码, 值在0到0×10FFFF之间, 基本上就是unicode编码的实现. 它是变长码, 与CPU字序有关, 但因为最省空间, 常作为网络传输的外码.
UTF-16是unicode的preferred encoding.

UTF-32, 仅使用了unicode范围(0到0×10FFFF)的32位编码, 相当于UCS-4的子集.

UTF与unicode的关系:

Unicode是一个字符集, 可以看作为内码.
而UTF是一种编码方式, 它的出现是因为unicode不适宜在某些场合直接传输和处理. UTF-16直接就是unicode编码, 没有变换, 但它包含了0×00在编码内, 头256字节码的第一个byte都是0×00, 在操作系统(C语言)中有特殊意义, 会引起问题. 采用UTF-8编码对unicode的直接编码作些变换可以避免这问题, 并带来一些优点.

中国国标编码:

GB 13000: 完全等同于ISO 10646-1/Unicode 2.1, 今后也将随ISO 10646/Unicode的标准更改而同步更改.

GBK: 对GB2312的扩充, 以容纳GB2312字符集范围以外的Unicode 2.1的统一汉字部分, 并且增加了部分unicode中没有的字符.

GB 18030-2000: 基于GB 13000, 作为Unicode 3.0的GBK扩展版本, 覆盖了所有unicode编码, 地位等同于UTF-8, UTF-16, 是一种unicode编码形式. 变长编码, 用单字节/双字节/4字节对字符编码. GB18030向下兼容GB2312/GBK.
GB 18030是中国所有非手持/嵌入式计算机系统的强制实施标准.

——————————-





什么是 UCS 和 ISO 10646?
国际标准 ISO 10646 定义了 通用字符集 (Universal Character Set, UCS). UCS 是所有其他字符集标准的一个超集. 它保证与其他字符集是双向兼容的. 就是说, 如果你将任何文本字符串翻译到 UCS格式, 然后再翻译回原编码, 你不会丢失任何信息.

UCS 包含了用于表达所有已知语言的字符. 不仅包括拉丁语,希腊语, 斯拉夫语,希伯来语,阿拉伯语,亚美尼亚语和乔治亚语的描述, 还包括中文, 日文和韩文这样的象形文字, 以及 平假名, 片假名, 孟加拉语, 旁遮普语果鲁穆奇字符(Gurmukhi), 泰米尔语, 印.埃纳德语(Kannada), Malayalam, 泰国语, 老挝语, 汉语拼音(Bopomofo), Hangul, Devangari, Gujarati, Oriya, Telugu 以及其他数也数不清的语. 对于还没有加入的语言, 由于正在研究怎样在计算机中最好地编码它们, 因而最终它们都将被加入. 这些语言包括 Tibetian, 高棉语, Runic(古代北欧文字), 埃塞俄比亚语, 其他象形文字, 以及各种各样的印-欧语系的语言, 还包括挑选出来的艺术语言比如 Tengwar, Cirth 和 克林贡语(Klingon). UCS 还包括大量的图形的, 印刷用的, 数学用的和科学用的符号, 包括所有由 TeX, Postscript, MS-DOS,MS-Windows, Macintosh, OCR 字体, 以及许多其他字处理和出版系统提供的字符.

ISO 10646 定义了一个 31 位的字符集. 然而, 在这巨大的编码空间中, 迄今为止只分配了前 65534 个码位 (0×0000 到 0xFFFD). 这个 UCS 的 16位子集称为 基本多语言面 (Basic Multilingual Plane, BMP). 将被编码在 16 位 BMP 以外的字符都属于非常特殊的字符(比如象形文字), 且只有专家在历史和科学领域里才会用到它们. 按当前的计划, 将来也许再也不会有字符被分配到从 0×000000 到 0×10FFFF 这个覆盖了超过 100 万个潜在的未来字符的 21 位的编码空间以外去了. ISO 10646-1 标准第一次发表于 1993 年, 定义了字符集与 BMP 中内容的架构. 定义 BMP 以外的字符编码的第二部分 ISO 10646-2 正在准备中, 但也许要过好几年才能完成. 新的字符仍源源不断地加入到 BMP 中, 但已经存在的字符是稳定的且不会再改变了.

UCS 不仅给每个字符分配一个代码, 而且赋予了一个正式的名字. 表示一个 UCS 或 Unicode 值的十六进制数, 通常在前面加上 "U+", 就象 U+0041 代表字符"拉丁大写字母A". UCS 字符 U+0000 到 U+007F 与 US-ASCII(ISO 646) 是一致的, U+0000 到 U+00FF 与 ISO 8859-1(Latin-1) 也是一致的. 从 U+E000 到 U+F8FF, 已经 BMP 以外的大范围的编码是为私用保留的.

什么是组合字符?
UCS里有些编码点分配给了 组合字符.它们类似于打字机上的无间隔重音键. 单个的组合字符不是一个完整的字符. 它是一个类似于重音符或其他指示标记, 加在前一个字符后面. 因而, 重音符可以加在任何字符后面. 那些最重要的被加重的字符, 就象普通语言的正字法(orthographies of common languages)里用到的那种, 在 UCS 里都有自己的位置, 以确保同老的字符集的向后兼容性. 既有自己的编码位置, 又可以表示为一个普通字符跟随一个组合字符的被加重字符, 被称为 预作字符(precomposed characters). UCS 里的预作字符是为了同没有预作字符的旧编码, 比如 ISO 8859, 保持向后兼容性而设的. 组合字符机制允许在任何字符后加上重音符或其他指示标记, 这在科学符号中特别有用, 比如数学方程式和国际音标字母, 可能会需要在一个基本字符后组合上一个或多个指示标记.

组合字符跟随着被修饰的字符. 比如, 德语中的元音变音字符 ("拉丁大写字母A 加上分音符"), 既可以表示为 UCS 码 U+00C4 的预作字符, 也可以表示成一个普通 "拉丁大写字母A" 跟着一个"组合分音符":U+0041 U+0308 这样的组合. 当需要堆叠多个重音符, 或在一个基本字符的上面和下面都要加上组合标记时, 可以使用多个组合字符. 比如在泰国文中, 一个基本字符最多可加上两个组合字符.

什么是 UCS 实现级别?
不是所有的系统都需要支持象组合字符这样的 UCS 里所有的先进机制. 因此 ISO 10646 指定了下列三种实现级别:

级别1
不支持组合字符和 Hangul Jamo 字符 (一种特别的, 更加复杂的韩国文的编码, 使用两个或三个子字符来编码一个韩文音节)
级别2
类似于级别1, 但在某些文字中, 允许一列固定的组合字符 (例如, 希伯来文, 阿拉伯文, Devangari, 孟加拉语, 果鲁穆奇语, Gujarati, Oriya, 泰米尔语, Telugo, 印.埃纳德语, Malayalam, 泰国语和老挝语). 如果没有这最起码的几个组合字符, UCS 就不能完整地表达这些语言.
级别3
支持所有的 UCS 字符, 例如数学家可以在任意一个字符上加上一个 tilde(颚化符号,西班牙语字母上面的~)或一个箭头(或两者都加).
什么是 Unicode?
历史上, 有两个独立的, 创立单一字符集的尝试. 一个是国际标准化组织(ISO)的 ISO 10646 项目, 另一个是由(一开始大多是美国的)多语言软件制造商组成的协会组织的 Unicode 项目. 幸运的是, 1991年前后, 两个项目的参与者都认识到, 世界不需要两个不同的单一字符集. 它们合并双方的工作成果, 并为创立一个单一编码表而协同工作. 两个项目仍都存在并独立地公布各自的标准, 但 Unicode 协会和 ISO/IEC JTC1/SC2 都同意保持 Unicode 和 ISO 10646 标准的码表兼容, 并紧密地共同调整任何未来的扩展.

那么 Unicode 和 ISO 10646 不同在什么地方?
Unicode 协会公布的 Unicode 标准 严密地包含了 ISO 10646-1 实现级别3的基本多语言面. 在两个标准里所有的字符都在相同的位置并且有相同的名字.

Unicode 标准额外定义了许多与字符有关的语义符号学, 一般而言是对于实现高质量的印刷出版系统的更好的参考. Unicode 详细说明了绘制某些语言(比如阿拉伯语)表达形式的算法, 处理双向文字(比如拉丁与希伯来文混合文字)的算法和 排序与字符串比较 所需的算法, 以及其他许多东西.

另一方面, ISO 10646 标准, 就象广为人知的 ISO 8859 标准一样, 只不过是一个简单的字符集表. 它指定了一些与标准有关的术语, 定义了一些编码的别名, 并包括了规范说明, 指定了怎样使用 UCS 连接其他 ISO 标准的实现, 比如 ISO 6429 和 ISO 2022. 还有一些与 ISO 紧密相关的, 比如 ISO 14651 是关于 UCS 字符串排序的.

考虑到 Unicode 标准有一个易记的名字, 且在任何好的书店里的 Addison-Wesley 里有, 只花费 ISO 版本的一小部分, 且包括更多的辅助信息, 因而它成为使用广泛得多的参考也就不足为奇了. 然而, 一般认为, 用于打印 ISO 10646-1 标准的字体在某些方面的质量要高于用于打印 Unicode 2.0的. 专业字体设计者总是被建议说要两个标准都实现, 但一些提供的样例字形有显著的区别. ISO 10646-1 标准同样使用四种不同的风格变体来显示表意文字如中文, 日文和韩文 (CJK), 而 Unicode 2.0 的表里只有中文的变体. 这导致了普遍的认为 Unicode 对日本用户来说是不可接收的传说, 尽管是错误的.

什么是 UTF-8?
首先 UCS 和 Unicode 只是分配整数给字符的编码表. 现在存在好几种将一串字符表示为一串字节的方法. 最显而易见的两种方法是将 Unicode 文本存储为 2 个 或 4 个字节序列的串. 这两种方法的正式名称分别为 UCS-2 和 UCS-4. 除非另外指定, 否则大多数的字节都是这样的(Bigendian convention). 将一个 ASCII 或 Latin-1 的文件转换成 UCS-2 只需简单地在每个 ASCII 字节前插入 0×00. 如果要转换成 UCS-4, 则必须在每个 ASCII 字节前插入三个 0×00.

在 Unix 下使用 UCS-2 (或 UCS-4) 会导致非常严重的问题. 用这些编码的字符串会包含一些特殊的字符, 比如 ‘\0′ 或 ‘/’, 它们在 文件名和其他 C 库函数参数里都有特别的含义. 另外, 大多数使用 ASCII 文件的 UNIX 下的工具, 如果不进行重大修改是无法读取 16 位的字符的. 基于这些原因, 在文件名, 文本文件, 环境变量等地方, UCS-2 不适合作为 Unicode 的外部编码.

在 ISO 10646-1 Annex R 和 RFC 2279 里定义的 UTF-8 编码没有这些问题. 它是在 Unix 风格的操作系统下使用 Unicode 的明显的方法.

UTF-8 有一下特性:

UCS 字符 U+0000 到 U+007F (ASCII) 被编码为字节 0×00 到 0×7F (ASCII 兼容). 这意味着只包含 7 位 ASCII 字符的文件在 ASCII 和 UTF-8 两种编码方式下是一样的.
所有 >U+007F 的 UCS 字符被编码为一个多个字节的串, 每个字节都有标记位集. 因此, ASCII 字节 (0×00-0×7F) 不可能作为任何其他字符的一部分.
表示非 ASCII 字符的多字节串的第一个字节总是在 0xC0 到 0xFD 的范围里, 并指出这个字符包含多少个字节. 多字节串的其余字节都在 0×80 到 0xBF 范围里. 这使得重新同步非常容易, 并使编码无国界, 且很少受丢失字节的影响.
可以编入所有可能的 231个 UCS 代码
UTF-8 编码字符理论上可以最多到 6 个字节长, 然而 16 位 BMP 字符最多只用到 3 字节长.
Bigendian UCS-4 字节串的排列顺序是预定的.
字节 0xFE 和 0xFF 在 UTF-8 编码中从未用到.
下列字节串用来表示一个字符. 用到哪个串取决于该字符在 Unicode 中的序号.

U-00000000 – U-0000007F: 0xxxxxxx
U-00000080 – U-000007FF: 110xxxxx 10xxxxxx
U-00000800 – U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 – U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 – U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 – U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

xxx 的位置由字符编码数的二进制表示的位填入. 越靠右的 x 具有越少的特殊意义. 只用最短的那个足够表达一个字符编码数的多字节串. 注意在多字节串中, 第一个字节的开头"1"的数目就是整个串中字节的数目.

例如: Unicode 字符 U+00A9 = 1010 1001 (版权符号) 在 UTF-8 里的编码为:

11000010 10101001 = 0xC2 0xA9

而字符 U+2260 = 0010 0010 0110 0000 (不等于) 编码为:

11100010 10001001 10100000 = 0xE2 0×89 0xA0

这种编码的官方名字拼写为 UTF-8, 其中 UTF 代表 UCS Transformation Format. 请勿在任何文档中用其他名字 (比如 utf8 或 UTF_8) 来表示 UTF-8, 当然除非你指的是一个变量名而不是这种编码本身.

什么编程语言支持 Unicode?
在大约 1993 年之后开发的大多数现代编程语言都有一个特别的数据类型, 叫做 Unicode/ISO 10646-1 字符. 在 Ada95 中叫 Wide_Character, 在 Java 中叫 char.

ISO C 也详细说明了处理多字节编码和宽字符 (wide characters) 的机制, 1994 年 9 月 Amendment 1 to ISO C 发表时又加入了更多. 这些机制主要是为各类东亚编码而设计的, 它们比处理 UCS 所需的要健壮得多. UTF-8 是 ISO C 标准调用多字节字符串的编码的一个例子, wchar_t 类型可以用来存放 Unicode 字符.

2005年06月16日

ASP函数用法
Array()
函数返回一个数组
表达式 Array(list)
允许数据类型: 字符,数字均可

实例:

<%
Dim myArray()
For i = 1 to 7
Redim Preserve myArray(i)
myArray(i) = WeekdayName(i)
Next
%>

返回结果: 建立了一个包含7个元素的数组myArray

myArray("Sunday","Monday", … … "Saturday"

CInt()

函数将一个表达式转化为数字类型
表达式 CInt(expression)
允许数据类型: 任何有效的字符均可
实例:
<%
f = "234"
response.write cINT(f) + 2
%>
返回结果: 236
转化字符"234"为数字"234",如果字符串为空,则返回0值
CreateObject()
函数建立和返回一个已注册的ACTIVEX组件的实例。
表达式 CreateObject(objName)
允许数据类型: objName 是任何一个有效、已注册的ACTIVEX组件的名字.

实例: <%

Set con = Server.CreateObject("ADODB.Connection"

%>


CStr()

函数转化一个表达式为字符串.

表达式 CStr(expression)

允许数据类型: expression 是任何有效的表达式。

实例: <%

s = 3 + 2

response.write "The 返回结果 is: " & cStr(s)

%>

返回结果: 转化数字“5”为字符“5”。


Date()

函数返回当前系统日期.

表达式 Date()

允许数据类型: None.

实例: <%=Date%>

返回结果: 9/9/00


DateAdd()

函数返回一个被改变了的日期。

表达式 DateAdd(timeinterval,number,date)

允许数据类型:
timeinterval is the time interval to add;
number is amount of time intervals to add;
and date is the starting date.

实例: <%

currentDate = #9/9/00#

newDate = DateAdd("m",3,currentDate)

response.write newDate

%>


<%

currentDate = #12:34:45 PM#

newDate = DateAdd("h",3,currentDate)

response.write newDate

%>

返回结果: 9/9/00

3:34:45 PM

"m" = "month";

"d" = "day";

If currentDate is in time format then,

"h" = "hour";

"s" = "second";


DateDiff()

函数返回两个日期之间的差值 。

表达式 DateDiff(timeinterval,date1,date2 [, firstdayofweek [, firstweekofyear]])

允许数据类型: timeinterval 表示相隔时间的类型,如“M“表示“月”。

实例: <%

fromDate = #9/9/00#

toDate = #1/1/2000#

response.write "There are " & _

DateDiff("d",fromDate,toDate) & _

" days to millenium from 9/9/00."

%>

返回结果: 从9/9/00 到2000年还有 150 天.


Day()

函数返回一个月的第几日 .

表达式 Day(date)

允许数据类型: date 是任何有效的日期。

实例: <%=Day(#9/9/00#)%>

返回结果: 4


FormatCurrency()

函数返回表达式,此表达式已被格式化为货币值

表达式 FormatCurrency(Expression [, Digit [, LeadingDigit [, Paren [, GroupDigit]]]])

允许数据类型: Digit 指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置; LeadingDigit 三态常数,指示是否显示小数值小数点前面的零。

实例: <%=FormatCurrency(34.3456)%>

返回结果: $34.35


FormatDateTime()

函数返回表达式,此表达式已被格式化为日期或时间

表达式 FormatDateTime(Date, [, NamedFormat])

允许数据类型: NamedFormat 指示所使用的日期/时间格式的数值,如果省略,则使用 vbGeneralDate.

实例: <%=FormatDateTime("09/9/00", vbLongDate)%>

返回结果: Sunday, September 09, 2000


FormatNumber()

函数返回表达式,此表达式已被格式化为数值.

表达式 FormatNumber(Expression [, Digit [, LeadingDigit [, Paren [, GroupDigit]]]])

允许数据类型: Digit 指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置。; LeadingDigit i指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置。; Paren 指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置。; GroupDigit i指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置。.

实例: <%=FormatNumber(45.324567, 3)%>

返回结果: 45.325


FormatPercent()

函数返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 (%)

表达式 FormatPercent(Expression [, Digit [, LeadingDigit [, Paren [, GroupDigit]]]])

允许数据类型: 同上.

实例: <%=FormatPercent(0.45267, 3)%>

返回结果: 45.267%


Hour()

函数以24时返回小时数.

表达式 Hour(time)

允许数据类型:

实例: <%=Hour(#4:45:34 PM#)%>

返回结果: 16

(Hour has been converted to 24-hour system)


Instr()

函数返回字符或字符串在另一个字符串中第一次出现的位置.

表达式 Instr([start, ] strToBeSearched, strSearchFor [, compare])

允许数据类型: Start为搜索的起始值,strToBeSearched接受搜索的字符串 strSearchFor要搜索的字符.compare比较方式(详细见ASP常数)

实例: <%

strText = "This is a test!!"

pos = Instr(strText, "a"

response.write pos

%>

返回结果: 9


InstrRev()

函数同上,只是从字符串的最后一个搜索起

表达式 InstrRev([start, ] strToBeSearched, strSearchFor [, compare])

允许数据类型: 同上.

实例: <%

strText = "This is a test!!"

pos = InstrRev(strText, "s"

response.write pos

%>

返回结果: 13


Int()

函数返回数值类型,不四舍五入。

表达式 Int(number)

允许数据类型:

实例: <%=INT(32.89)%>

返回结果: 32


IsArray()

函数判断一对象是否为数组,返回布尔值 .

表达式 IsArray(name)

实例: <%

strTest = "Test!"

response.write IsArray(strTest)

%>

返回结果: False


IsDate()

函数判断一对象是否为日期,返回布尔值

表达式 IsDate(expression)

实例: <%

strTest = "9/4/2000"

response.write IsDate(strTest)

%>

返回结果: True


IsEmpty()

函数判断一对象是否初始化,返回布尔值.

表达式 IsEmpty(expression)

实例: <%

Dim i

response.write IsEmpty(i)

%>

返回结果: True


IsNull()

函数判断一对象是否为空,返回布尔值.

表达式 IsNull(expression)

实例: <%

Dim i

response.write IsNull(i)

%>

返回结果: False


IsNumeric()

函数判断一对象是否为数字,返回布尔值.

表达式 IsNumeric(expression)

实例: <%

i = "345"

response.write IsNumeric(i)

%>

返回结果: True

就算数字加了引号,ASP还是认为它是数字。


IsObject()

函数判断一对象是否为对象,返回布尔值.

表达式 IsObject(expression)

实例: <%

Set con = Server.CreateObject("ADODB.Connection"

response.write IsObject(con)

%>

返回结果: True


LBound()

函数返回指定数组维的最小可用下标.

表达式 Lbound(arrayname [, dimension])

实例: <%

i = Array("Monday","Tuesday","Wednesday"

response.write LBound(i)

%>

返回结果: 0


LCase()

函数 返回字符串的小写形式

表达式 Lcase(string)

实例: <%

strTest = "This is a test!"

response.write LCase(strTest)

%>

返回结果: this is a test!


Left()

函数返回字符串左边第length个字符以前的字符(含第length个字符).

表达式 Left(string, length)

实例: <%

strTest = "This is a test!"

response.write Left(strTest, 3)

%>

返回结果: Thi


Len()

函数返回字符串的长度.

表达式 Len(string | varName)

实例: <%

strTest = "This is a test!"

response.write Len(strTest)

%>

返回结果: 15


LTrim()

函数去掉字符串左边的空格.

表达式 LTrim(string)

实例: <%

strTest = " This is a test!"

response.write LTrim(strTest)

%>

返回结果: This is a test!


Mid()

函数返回特定长度的字符串(从start开始,长度为length).

表达式 Mid(string, start [, length])

实例: <%

strTest = "This is a test! Today is Monday."

response.write Mid(strTest, 17, 5)

%>

返回结果: Today


Minute()

函数返回时间的分钟.

表达式 Minute(time)

实例: <%=Minute(#12:45:32 PM#)%>

返回结果: 45


Month()

函数返回日期.

表达式 Month(date)

实例: <%=Month(#08/04/99#)%>

返回结果: 8


MonthName()

函数返回指定月份

表达式 MonthName(month, [, Abb])

实例: <%=MonthName(Month(#08/04/99#))%>

返回结果: August


Now()

函数返回系统时间

表达式 Now()

实例: <%=Now%>

返回结果: 9/9/00 9:30:16 AM


Right()

函数返回字符串右边第length个字符以前的字符(含第length个字符).

表达式 Right(string, length)

实例: <%

strTest = "This is an test!"

response.write Right(strTest, 3)

%>

返回结果: st!


Rnd()

函数产生一个随机数.

表达式 Rnd [ (number) ]

实例: <%

Randomize()

response.write RND()

%>

返回结果: 任何一个在0 到 1 之间的数


Round()

函数返回按指定位数进行四舍五入的数值.

表达式 Round(expression [, numRight])

实例: <%

i = 32.45678

response.write Round(i)

%>

返回结果: 32


Rtrim()

函数去掉字符串右边的字符串.

表达式 Rtrim(string)

实例: <%

strTest = "This is a test!! "

response.write RTrim(strTest)

%>

返回结果: This is a test!!


Split()

函数将一个字符串分割并返回分割结果

表达式 Split (S[,d])

实例:<%V= Split(A,B,C)

For i = 0 To UBound(V)

Response.Write V(i)

Next

%>

返回结果: A B C


Second()

函数返回秒.

表达式 Second(time)

实例: <%=Second(#12:34:28 PM#)%>

返回结果: 28


StrReverse()

函数反排一字符串

表达式 StrReverse(string)

实例: <%

strTest = "This is a test!!"

response.write StrReverse(strTest)

%>

返回结果: !!tset a si sihT


Time()

函数返回系统时间.

表达式 Time()

实例: <%=Time%>

返回结果: 9:58:28 AM


Trim()

函数去掉字符串左右的空格.

表达式 Trim(string)

实例: <%

strTest = " This is a test!! "

response.write Trim(strTest)

%>

返回结果: This is a test!!


UBound()

函数返回指定数组维数的最大可用下标>.

表达式 Ubound(arrayname [, dimension])

实例: <%

i = Array("Monday","Tuesday","Wednesday"

response.write UBound(i)

%>

返回结果: 2


UCase()

函数返回字符串的大写形式.

表达式 UCase(string)

允许数据类型:

实例: <%

strTest = "This is a test!!"

response.write UCase(strTest)

%>

返回结果: THIS IS A TEST!!


VarType()

函数返回指示变量子类型的值

表达式 VarType(varName)

实例: <%

i = 3

response.write varType(i)

%>

返回结果: 2(数字)详见"asp常数"


WeekDay()

函数返回在一周的第几天.

表达式 WeekDay(date [, firstdayofweek])

实例: <%

d = #9/9/00#

response.write Weekday(d)

%>

返回结果: 4(星期三)


WeekDayName()

函数返回一周第几天的名字.

表达式 WeekDayName(weekday [, Abb [, firstdayofweek]])

实例: <%

d = #9/9/00#

response.write WeekdayName(Weekday(d))

%>

返回结果: Wednesday


Year()

函数返回当前的年份.

表达式 Year(date)

实例: <%=Year(#9/9/00#)%>

返回结果: 1999

2005年06月14日

校验与远程计算机或本地计算机的连接。只有在安装 TCP/IP 协议之后才能使用该命令。

ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r count] [-s count] [[-j computer-list] | [-k computer-list]] [-w timeout] destination-list

参数

-t

校验与指定计算机的连接,直到用户中断。

-a

将地址解析为计算机名。

-n count

发送由 count 指定数量的 ECHO 报文,默认值为 4。

-l length

发送包含由 length 指定数据长度的 ECHO 报文。默认值为 64 字节,最大值为 8192 字节。

-f

在包中发送“不分段”标志。该包将不被路由上的网关分段。

-i ttl

将“生存时间”字段设置为 ttl 指定的数值。

-v tos

将“服务类型”字段设置为 tos 指定的数值。

-r count

在“记录路由”字段中记录发出报文和返回报文的路由。指定的 Count 值最小可以是 1,最大可以是 9 。

-s count

指定由 count 指定的转发次数的时间邮票。

-j computer-list

经过由 computer-list 指定的计算机列表的路由报文。中间网关可能分隔连续的计算机(松散的源路由)。允许的最大 IP 地址数目是 9 。

-k computer-list

经过由 computer-list 指定的计算机列表的路由报文。中间网关可能分隔连续的计算机(严格源路由)。允许的最大 IP 地址数目是 9 。

-w timeout

以毫秒为单位指定超时间隔。

destination-list

指定要校验连接的远程计算机。

关于 Ping 的详细信息

Ping–注意

Ping 命令通过向计算机发送 ICMP 回应报文并且监听回应报文的返回,以校验与远程计算机或本地计算机的连接。对于每个发送报文, Ping 最多等待 1 秒,并打印发送和接收把报文的数量。比较每个接收报文和发送报文,以校验其有效性。默认情况下,发送四个回应报文,每个报文包含 64 字节的数据(周期性的大写字母序列)。

可以使用 Ping 实用程序测试计算机名和 IP 地址。如果能够成功校验 IP 地址却不能成功校验计算机名,则说明名称解析存在问题。这种情况下,要保证在本地 HOSTS 文件中或 DNS

数据库中存在要查询的计算机名。

下面显示 Ping 输出的示例:(Windows用户可用:开始->运行,输入"command" 调出command窗口使用此命令)

C:\>ping ds.internic.net

Pinging ds.internic.net [192.20.239.132] with 32 bytes of data:

Reply from 192.20.239.132: bytes=32 time=101ms TTL=243

Reply from 192.20.239.132: bytes=32 time=100ms TTL=243

Reply from 192.20.239.132: bytes=32 time=120ms TTL=243

Reply from 192.20.239.132: bytes=32 time=120ms TTL=243

Apache conf 中文说明
# Apache服务器主配置文件.  包括服务器指令的目录设置.
# 详见 <URL:http://www.apache.org/docs/>
#
# 请在理解用途的基础上阅读各指令。
#
# 再读取此文档后,服务器将继续搜索运行
# E:/Program Files/Apache Group/Apache/conf/srm.conf
# E:/Program Files/Apache Group/Apache/conf/access.conf
# 除非用ResourceConfig或AccessConfig覆盖这儿的标识
#
# 配置标识由三个基本部分组成:
#  1. 作为一个整体来控制Apache服务器进程的标识 (the ‘global environment’).
#  2. 用于定义主(默认)服务器参数的标识。
#     响应虚拟主机不能处理的请求。
#     同时也提供所有虚拟主机的设置值。
#  3. 虚拟主机的设置。在一个Apache服务器进程中配置不同的IP地址和主机名。
#
# 配置和日志文件名:指定服务器控制文件命名时,
# 以 "/" (或 "drive:/" for Win32)开始,服务器将使用这些绝对路径。
# 如果文件名不是以"/"开始的,预先考虑服务器根目录–
#  因此 "logs/foo.log",如果服务器根目录是"/usr/local/apache",
#  服务器将解释为 "/usr/local/apache/logs/foo.log".
#
# 注: 指定的文件名需要用"/"代替"\"。
# (例, "c:/apache" 代替 "c:\apache").
# 如果省略了驱动器名,默认使用Apache.exe所在的驱动器盘符
# 建议指定盘符,以免混乱。
#

### 部分 1: 全局环境
#
# 本部分的表示将影响所有Apache的操作
# 例如,所能处理的并发请求数或配置文件地址
#

#
# ServerType 可取值 inetd 或 standalone.  Inetd 只适用于Unix平台
#
ServerType standalone

#
# ServerRoot: 目录树的根结点。服务器配置、出错信息、日志文件都保存在根目录下。
#
# 不要再目录末尾加"/"
#
ServerRoot "C:/Program Files/Apache Group/Apache"

#
# PidFile: 服务器用于记录启动时进程ID的文件。
#
PidFile logs/httpd.pid

#
# ScoreBoardFile: 用于保存内部服务器进程信息的文件。
# 并非必须。 但是如果指定了(此文件当运行Apache时生成)
# 那么必须确保没有两个Apache进程共享同一个scoreboard文件。
#
ScoreBoardFile logs/apache_runtime_status

#
# 在标准配置下,服务器将顺序读取 httpd.conf(此文件可通过命令行中-f参数指定),
# srm.conf 和 access.conf。
# 目前后两个文件是空的。为了简单起见,建议将所有的标识放在一个文件中。 
# 以下两条注释的标识,是默认设置。
# 要让服务器忽略这些文件可以用 "/dev/null" (for Unix)
# 或"nul" (for Win32) 作为参数。
#
#ResourceConfig conf/srm.conf
#AccessConfig conf/access.conf

#
# Timeout: 接受和发送timeout的时间
#
Timeout 300

#
# KeepAlive: 是否允许保持连接(每个连接有多个请求)
# "Off" -无效
#
KeepAlive On

#
# MaxKeepAliveRequests: 每个连接的最大请求数。
# 设置为0表示无限制
# 建议设置较高的值,以获得最好的性能。
#
MaxKeepAliveRequests 100

#
# KeepAliveTimeout: 同一连接同一客户端两个请求之间的等待时间。
#
KeepAliveTimeout 15

#
# 在Win32下,Apache每次产生一个子进程来处理请求。
# 如果这个进程死了,会自动产生另一个子进程。
# 所有的进入请求在子进程中多线程处理。
# 以下两个标识控制进程的运行
#

#
# MaxRequestsPerChild: 每个子进程死亡之前最大请求数
# 如果超过这个请求数,子程序会自动退出,避免延期使用导致内存溢出或其他问题。
# 大部分系统,并不需要此设置,
# 但是部分,象Solaris,确实值得注意。
# 对Win32, 可设置为0 (无限制)
# 除非有另外的考虑。
#
# 注: 此值不包括在每个连接初始化请求后,"keptalive"请求
#       例如, 如果一个子进程处理一个初始化请求和10个后续"keptalive"请求,
#       在这个限制下,只会记为一个请求。
#
MaxRequestsPerChild 0

#
# ThreadsPerChild: 服务器所允许的并发线程数。
# 此值的设置取决于服务器的响应能力(约多的请求在同一时间激活,则每个请求的处理时间越慢)
# 和服务器所允许消耗的系统资源。
#
ThreadsPerChild 50

#
# Listen: 允许将Apache绑顶到指定的IP地址和端口,作为默认值的辅助选项。
# 参见
#
#Listen 3000
#Listen 12.34.56.78:80

#
# BindAddress: 通过此选项可支持虚拟主机。
# 此标识用于告诉服务器监听哪个IP地址。
# 包括:"*", IP地址, 或域名.
# 参见 和 Listen directives.
#
BindAddress 166.111.178.144

#
# Apache模块编译成标准的Windows结构。
#
# 以下模块绑定到标准的Apache二进制windows分布。
# 要修改标准操作,取消以下行的注释并且修改指定模块列表。
#
# 警告:这是高级选项。可能导致服务器崩溃。
# 没有专家的指导,不要轻易修改。
#
#ClearModuleList
#AddModule mod_so.c mod_mime.c mod_access.c mod_auth.c mod_negotiation.c
#AddModule mod_include.c mod_autoindex.c mod_dir.c mod_cgi.c mod_userdir.c
#AddModule mod_alias.c mod_env.c mod_log_config.c mod_asis.c mod_imap.c
#AddModule mod_actions.c mod_setenvif.c mod_isapi.c

#
# 动态共享对象(Dynamic Shared Object,DSO)
#
# 要使用基于DSO的功能模块,需要替换此处相应的
#  `LoadModule’ 行。这样在使用之前这些包含的标识都将生效。
# 有关DSO及至的详细资料请看Apache1.3版中的README.DSOSO。
# 运行"apche -l"将列表显示Apache内奸的模块(类似标准的连接已经生效)
#
# 注:模块载入的顺序很重要。没有专家的建议,不要修改以下的顺序。
#
#LoadModule anon_auth_module modules/ApacheModuleAuthAnon.dll
#LoadModule dbm_auth_module modules/ApacheModuleAuthDBM.dll
#LoadModule digest_auth_module modules/ApacheModuleAuthDigest.dll
#LoadModule cern_meta_module modules/ApacheModuleCERNMeta.dll
#LoadModule digest_module modules/ApacheModuleDigest.dll
#LoadModule expires_module modules/ApacheModuleExpires.dll
#LoadModule headers_module modules/ApacheModuleHeaders.dll
#LoadModule proxy_module modules/ApacheModuleProxy.dll
#LoadModule rewrite_module modules/ApacheModuleRewrite.dll
#LoadModule speling_module modules/ApacheModuleSpeling.dll
#LoadModule info_module modules/ApacheModuleInfo.dll
#LoadModule status_module modules/ApacheModuleStatus.dll
#LoadModule usertrack_module modules/ApacheModuleUserTrack.dll

#
# ExtendedStatus 在服务器状态句柄被呼叫时控制是产生"完整"的状态信息(ExtendedStatus On)
# 还是仅返回基本信息(ExtendedStatus Off)
# 默认是:Off
#
#ExtendedStatus On

### 部分 2: 主服务器配置
#
# 此部分的标识用于主服务器所有的设置值,
# 响应任何定义不处理的请求
# 这些值同时给你稍后在此文件中定义的提供默认值。
#
# 所有的标识可能会在中出现。
# 对应的默认值会被虚拟主机重新定义覆盖。
#

#
# Port: Standalone服务器监听的端口。 
# 在Apache能够监听指定端口前,需要在防火墙中进行设置。
# 其它运行httpd的服务器也可能影响此端口。  Disable
# 如果遇到问题,请关闭所有的防火墙、安全保护和其他的服务。
# Windos NT的"NETSTAT -a"指令会有助于问题的分析。
#
Port 80

#
# ServerAdmin: 你的地址。如果服务器有任何问题将发信到这个地址。
# 这个地址会在服务器产生的某些页面中出现,例如,错误报告。
#
ServerAdmin chenyl98@mails.tsinghua.edu.cn

#
# ServerName 允许设置主机名。如果与程序获得的不同,主机名将返回客户端。
# (例如,用"www"代替主机真实的名字)
#
# 注: 主机名不能随便指定。必须是你的机器有效的DNS名称。否则无法正常工作。
# 如果不能理解,倾向你的网络管理员询问。
# 如果你的主机没有注册DNS名,可在此输入IP地址。
# 此时必须用IP地址来访问。(如, http://123.45.67.89/)
# 这样扔可以完成重新定向的工作。
#
# 127.0.0.1 是TCP/IP的本地环路地址, 通常命名为localhost.
# 机器默认此地置为本身。 如果只是使用Apache来进行本地测试和开发,
# 可使用127.0.0.1 作为服务器名.
#
#ServerName new.host.name


#
# DocumentRoot: 放置服务文档的目录。
# 默认状态下,所有的请求都以这个目录为基础。
# 但是直接符号连接和别名可用于指向其他位置。
#
DocumentRoot "D:/www_root"

#
# Apache访问的每个目录可设置相关的服务和特性是允许或(和)不允许。
# (同样影响其子目录)
#
# 首先,设置"default"地址只有最基本的权限。
#

    Options FollowSymLinks
    AllowOverride None


#
# 注意从现在开始必须制定开启特殊的权限。
# 这样就不会产生意想不到的结果。
# 请仔细确认。
#

#
# 这个地址应与DocumentRoot保持一致
#


#
# 此值可是: "None", "All", 或下列的组合: "Indexes",
# "Includes", "FollowSymLinks", "ExecCGI", 或 "MultiViews".
#
# 注意"MultiViews"必须明确指定— "Options All"不包括此特性。
#
    Options Indexes FollowSymLinks MultiViews

#
# 此项控制目录中哪些.htaccess文件可覆盖。
# 允许值: "All"或者以下项的组合:"Options", "FileInfo",
# "AuthConfig", "Limit"
#
    AllowOverride None

#
# 控制哪些用户可从此服务器获得资料。
#
    Order allow,deny
    Allow from all


#
# UserDir: 当请求~user时,追加到用户主目录的路径地址。
#
# 在Win32下,并不要求指定为用户登陆的主目录。
# 因此可使用以下的格式。
# 详细参照文档UserDir
#

    UserDir "f:/homepages/"


#
# 控制访问UserDir目录.  The following is an example
# 以下是一个站点的例子,权限限制为只读。
#
#
#    AllowOverride FileInfo AuthConfig Limit
#    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
#   
#        Order allow,deny
#        Allow from all
#   
#   
#        Order deny,allow
#        Deny from all
#   
#

#
# DirectoryIndex: 预设的HTML目录索引文件名。
# 用空格来分隔多个文件名。
#

    DirectoryIndex index.html


#
# AccessFileName: 每个目录中用于控制访问信息的文件名。
#
AccessFileName .htaccess

#
# 以下行防止客户端可访问 .htaccess 文件。
# 因为 .htaccess文件通常包含授权信息,
# 处于安全的考虑不允许访问。
# 如果想让访客看到.htaccess文件的内容,
# 可将这些行注释。
# 如果修改了上面的AccessFileName,
# 请在此进行相应的修改。
#
# 同时,一般会用类似.htpasswd的文件保存密码。
# 这些文件同样可以得到保护。
#

    Order allow,deny
    Deny from all


#
# CacheNegotiatedDocs: 默认下,Apache对每个文档发送"Pragma: no-cache"
# 这将要求代理服务器不缓存此文档。
# 取消下列行的可取消这个属性,这样代理服务器将缓存这些文档。
#
#CacheNegotiatedDocs

#
# UseCanonicalName:  (1.3新增)  当此设置为on时,
# 无论何时Apache需要构建一个自引用的URL(指向响应来源服务器),
# 它将用ServerName和Port来构建一个规范的格式。
# 当此设置为off时,Apache将使用客户端提供的"主机名:端口"
# 这将同时影响CGI脚本中的SERVER_NAME和SERVER_PORT
#
UseCanonicalName On

#
# TypesConfig 记录媒体类型(mime.types)文件或类似的东东放置的位置
#

    TypesConfig conf/mime.types


#
# DefaultType 是服务器处理未确认类型的文件,如为止的扩展名,的默认类型。
# 如果你的服务器上主要包含的是文本或HTML文档,"text/plain"是较好的设置
# 如果服务器上主要包含二进制文件,如应用程序或图片,
# 最好设置成"application/octet-stream"防止浏览器将二进制文件以文本的方式显示。
#
DefaultType text/plain

#
# mod_mime_magic模块允许服务器使用文件自身的不同标识来确定文件类型。
# MIMEMagicFile指示模块文件标识的定义所在的位置。
# mod_mime_magic不是默认服务器的一部分。
# (必须自行用LoadModule来追加 [见'全局环境'部分的 DSO 章节],
# 或者在编译服务器时包含mod_mime_magic部分)
# 包含在 中.
# 就是说,如果该模块是服务器的一部分,MIMEMagicFile标识将执行。
#

    MIMEMagicFile conf/magic


#
# HostnameLookups: 注册客户端的机器名或IP地址。
# 例如: www.apache.org (on) 或 204.62.129.132 (off).
# 默认为off,因为对于网络来说,最好让人们有意识的设置为on,
# 因为开启此功能意味着每个客户请求将导致至少向name服务器发送一个lookup请求
#
HostnameLookups Off

#
# ErrorLog: 错误记录文件的地址
# 如果不在内指定ErrorLog
# 改虚拟主机的错误心细将记录到此处。
# 如果在中明确指定了错误记录文件,
# 则错误将记录在那儿而不是这儿。
#
ErrorLog logs/error.log

#
# LogLevel: 控制记录在error.log中信息的个数.
# 可能的值:debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn

#
# 以下标识定义CustomLog标识使用的格式。(见下)
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

#
# 访问记录的位置和格式 (功用的记录文件格式).
# 如果不在中定义记录文件,
# 那些访问记录就将保存在这儿。  Contrariwise, if you *do*
# 反之,如果指定了记录文件,那么访问记录将记录在那儿而不是这个文件中。
#
CustomLog logs/access.log common

#
# 如果希望使用代理和参考的记录文件, 取消以下标识的注释符
#
#CustomLog logs/referer.log referer
#CustomLog logs/agent.log agent

#
# 如果想在一个文件中记录访问、代理、参考信息(复合的记录格式)
# 可使用以下标识
#
#CustomLog logs/access.log combined

#
# 在服务器产生的页面(如错误文档信息,FTP目录列表等等,不包括CGI产生的文档)中
# 增加一条服务器版本和虚拟主机名的信息。
# 设置为"EMail"将包含mailto: ServerAdmin的连接.
# 可选值:  On | Off | EMail
#
ServerSignature On

#
# 默认下,Apache用工作行解析所有CGI脚本
# 此注释行(脚本的第一行)包括’#'和’!'后面跟着执行特殊脚本的程序路径,
# 对perl脚本来说是C:\Program Files\Perl目录中的perl.exe。
# 工作行如下:

   #!c:/program files/perl/perl

# 注意真实的工作行不能有缩进,必须是文件的第一行。
# 当然,CGI进程必须通过适当的ScriptAlias或ExecCGI选项标识来启动。
#
# 然而,Windows下的Apache即允许以上的Unix方式,也可以通过注册表的形式。
# 用注册表执行文件的方法同在Windows资源管理器中双击运行的注册方法相同。
# 此脚本操作可在Windows资源管理器的"查看"菜单中设置。
# "文件夹选项",然后查看"文件类型"。点击编辑按钮。
# 修改操作属性。Apache 1.3会尝试执行‘Open’操作,
# 如果失败则会尝试工作行
# 这个属性在Apache release 2.0中会有改变.
#
# 每个机制都有自身特定的安全弱点,这样可能导致别人运行你不希望调用的程序。
# 最佳的解决方案还在讨论中。
#
# 要是这个Windows的特殊属性生效 (同时会是Unix属性无效)
# 取消下列标识的注释符。
#
#ScriptInterpreterSource registry
#
# 上面的标识可在块或.htaccess文件中单独替换。
# 可选择’registry’ (Windows behavior)或 ’script’
# (Unix behavior) option, 将覆盖服务器的默认值。
#

#
# Aliases: 可无限制的追加别名。格式如下:
# Alias 假名 真名
#


    #
    # 注意如果假名中包含’/',服务器会在当前URL中发出请求。
    # 因此"/icons"不能用于别名
    # 必须用 "/icons/"..
    #
    Alias /icons/ "C:/Program Files/Apache Group/Apache/icons/"

   
        Options Indexes MultiViews
        AllowOverride None
        Order allow,deny
        Allow from all
   

    #
    # ScriptAlias: 控制哪个目录包含服务器脚本。
    # ScriptAlias本质行和Aliases一样。, except that
    # 区别在于真名目录中的文档被看作是一个应用程序。
    # 请求时由服务器运行而不是发往客户端。
    # "/"符号的规则同
    # Alias相同.
    #
    ScriptAlias /cgi-bin/ "C:/Program Files/Apache Group/Apache/cgi-bin/"

    #
    # "C:/Program Files/Apache Group/Apache/cgi-bin" 可修改为任何放置CGI脚本的目录
    #
   
        AllowOverride None
        Options None
        Order allow,deny
        Allow from all
   


# 别名结束

#php脚本说明

ScriptAlias /php/ "d:/php/"
AddType application/x-httpd-php .php
AddType application/x-httpd-php .php3
AddType application/x-httpd-php .phtml
Action application/x-httpd-php "/php/php.exe"

#php脚本说明结束

#
# Redirect 允许告诉客户端服务器上曾经有的文档,但是现在不存在了。
# 并且可以告诉客户端到哪儿去寻找。
# 格式: Redirect old-URL new-URL
#

#
# 控制服务器目录列表显示的标识
#


    #
    # FancyIndexing标识是使用特定的目录检索还是标准的(standard)
    #
    IndexOptions FancyIndexing

    #
    # AddIcon*表明不同文件或扩展名显示的图标。
    # 这些图标只在特定检索状态下显示。
    #
    AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

    AddIconByType (TXT,/icons/text.gif) text/*
    AddIconByType (IMG,/icons/image2.gif) image/*
    AddIconByType (SND,/icons/sound2.gif) audio/*
    AddIconByType (VID,/icons/movie.gif) video/*

    AddIcon /icons/binary.gif .bin .exe
    AddIcon /icons/binhex.gif .hqx
    AddIcon /icons/tar.gif .tar
    AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
    AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
    AddIcon /icons/a.gif .ps .ai .eps
    AddIcon /icons/layout.gif .html .shtml .htm .pdf
    AddIcon /icons/text.gif .txt
    AddIcon /icons/c.gif .c
    AddIcon /icons/p.gif .pl .py
    AddIcon /icons/f.gif .for
    AddIcon /icons/dvi.gif .dvi
    AddIcon /icons/uuencoded.gif .uu
    AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
    AddIcon /icons/tex.gif .tex
    AddIcon /icons/bomb.gif core

    AddIcon /icons/back.gif ..
    AddIcon /icons/hand.right.gif README
    AddIcon /icons/folder.gif ^^DIRECTORY^^
    AddIcon /icons/blank.gif ^^BLANKICON^^

    #
    # DefaultIcon 用于为制定图标的文件所显示的图标。
    #
    DefaultIcon /icons/unknown.gif

    #
    # AddDescription在服务器生成的检索的某个文件后追加小段说明。
    # 此项只在设置为FancyIndexed时有效
    # 格式:AddDescription "描述" 文件名
    #
    #AddDescription "GZIP compressed document" .gz
    #AddDescription "tar archive" .tar
    #AddDescription "GZIP compressed tar archive" .tgz

    #
    # ReadmeName是服务器默认的README文件。
    # 并且会追加到目录列表的最后。
    #
    # HeaderName 是目录中需要预先显示内容的文件名。
    #
    # 如果MultiViews在选项中,作为结果,服务器将先找name.html,
    # 如果存在就包含它。如果name.html不存在,
    # 服务器会继续寻找name.txt。如果存在就作为纯文本包含进来。
    #
    ReadmeName README
    HeaderName HEADER

    #
    # IndexIgnore是一系列的文件名。目录索引将忽略这些文件并且不包含在列表中。
    # 允许使用通配符。
    #
    IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t


# indexing标识结束

#
# 文件类型
#


    #
    # AddEncoding 可用于特殊浏览器(Mosaic/X 2.1+)快速传输压缩信息。
    # 注:并不是所有的服务器都支持。
    # 除了名字相似,以下Add*标识对上面的FancyIndexing定制标识无影响。
    #
    AddEncoding x-compress Z
    AddEncoding x-gzip gz tgz
    #
    # AddLanguage用于指定文档的语言。
    # 可以使用content标签指定每个文件的语言。
    #
    # 注 1: 后缀不必与所用语言的关键字相同。
    #   — 波兰语(Polish,标准代码为pl)的文档可以用
    #  "AddLanguage pl .po" 来避免与perl脚本文件混淆。
    #
    # 注 2: 以下例子表明两个字母的语言缩写和两个字母的国家缩写并不一定相同。
    # E.g. ‘Danmark/dk’ 对比 ‘Danish/da’.
    #
    # 注 3: 其中’ltz’使用了三个字符,与RFC的规定不同。
    # 但是这个问题正在修订中,并且重新清理RFC1766
    #
    # 丹麦Danish (da) – 荷兰Dutch (nl) – 英国English (en) – 爱萨尼亚Estonian (ee)
    # 法国French (fr) – 德国German (de) – 现代希腊文Greek-Modern (el)
    # 意大利Italian (it) – 朝鲜Korean (kr) – 挪威Norwegian (no)
    # 葡萄牙Portuguese (pt) – 卢森堡Luxembourgeois* (ltz)
    # 西班牙Spanish (es) – 瑞典Swedish (sv) – 加泰罗尼亚Catalan (ca) – 捷克Czech(cz)
    # 波兰Polish (pl) – 巴西Brazilian Portuguese (pt-br) – 日本Japanese (ja)
    # 俄国Russian (ru)
    #
    AddLanguage da .dk
    AddLanguage nl .nl
    AddLanguage en .en
    AddLanguage et .ee
    AddLanguage fr .fr
    AddLanguage de .de
    AddLanguage el .el
    AddLanguage he .he
    AddCharset ISO-8859-8 .iso8859-8
    AddLanguage it .it
    AddLanguage ja .ja
    AddCharset ISO-2022-JP .jis
    AddLanguage kr .kr
    AddCharset ISO-2022-KR .iso-kr
    AddLanguage no .no
    AddLanguage pl .po
    AddCharset ISO-8859-2 .iso-pl
    AddLanguage pt .pt
    AddLanguage pt-br .pt-br
    AddLanguage ltz .lu
    AddLanguage ca .ca
    AddLanguage es .es
    AddLanguage sv .se
    AddLanguage cz .cz
    AddLanguage ru .ru
    AddLanguage tw .tw
    AddCharset Big5         .Big5    .big5
    AddCharset WINDOWS-1251 .cp-1251
    AddCharset CP866        .cp866
    AddCharset ISO-8859-5   .iso-ru
    AddCharset KOI8-R       .koi8-r
    AddCharset UCS-2        .ucs2
    AddCharset UCS-4        .ucs4
    AddCharset UTF-8        .utf8

    # LanguagePriority 可设置语言的优先级。
    #
    # 优先级降序排列
    # 在此处按照字母顺序,可自行修改
    #
   
        LanguagePriority en da nl et fr de el it ja kr no pl pt pt-br ru ltz ca es sv tw
   

    #
    # AddType 可临时改变mime.types或者指定特殊文件的格式。
    #
    # 例如:PHP 3.x 模块 (非Apache标准配件,参见http://www.php.net)可用下面格式定义:
    #
    #AddType application/x-httpd-php3 .php3
    #AddType application/x-httpd-php3-source .phps
    #
    # PHP 4.x, 使用:
    #
    #AddType application/x-httpd-php .php
    #AddType application/x-httpd-php-source .phps

    AddType application/x-tar .tgz

    #
    # AddHandler 可将特定文件扩展名映射到处理方法上。
    # 与文件类型无关。此特性可内建到服务器中或者追加在操作指令中(见下)
    #
    # 如果希望用服务器端应用或ScriptAliased外的CGI,取消以下行的注释符
    #
    # 用CGI脚本:
    #
    #AddHandler cgi-script .cgi

    #
    # 用服务器解析的HTML文档
    #
    #AddType text/html .shtml
    #AddHandler server-parsed .shtml

    #
    # 取消以下注释符可激活Apache的send-asis HTTP file特性
    #
    #AddHandler send-as-is asis

    #
    # 如果使用服务器端解析的图像定位文件,使用以下标识:
    #
    #AddHandler imap-file map

    #
    # 要激活type maps使用:
    #
    #AddHandler type-map var


# 文档类型说明结束

#
# Action 定义在文件匹配时执行相应的脚本。
# 可简化常用CGI文件的调用。
# 格式: Action media/type /cgi-script/location
# 格式: Action handler-name /cgi-script/location
#

#
# MetaDir: 指定保存meta信息文件的目录。
# 这些文件包含附加的HTTP头,在发送文档是一并发送。
#
#MetaDir .web

#
# MetaSuffix: 指定包含meta信息的文件的后缀。
#
#MetaSuffix .meta

#
# 可定制的错误响应(Apache类型)
#  共三种风格:
#
#    1) 纯文本
#ErrorDocument 500 "The server made a boo boo.
#  注: 第一个"号用于表示是文本,实际不输出
#
#    2) 本地重定向
#ErrorDocument 404 /missing.html
#  to redirect to local URL /missing.html
#ErrorDocument 404 /cgi-bin/missing_handler.pl
#  注:可重定向到任何一个服务器端的脚本或文档
#
#    3) 外部重定向
#ErrorDocument 402 http://some.other_server.com/subscription_info.html
#  注: 大部分与初始请求关联的环境变量对这样的脚本无效。
#

#
# 基于浏览器的定制操作
#


    #
    # 以下标识修改普通的HTTP响应操作。
    # 第一个标识针对Netscape2.x和其他无此功能的浏览器取消保持激活状态的功能
    # 这些浏览器在执行这些功能时会出错。
    # 第二个标识针对IE4.0b2设置。其中有一条不完整的HTTP/1.1指令
    # 在301或302(重定向)响应时不能正确的保持激活状态
    #
    BrowserMatch "Mozilla/2" nokeepalive
    BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0

    #
    # 下面的标识通过不产生基本的1.1响应取消对违反HTTP/1.0标准的浏览器的响应。
    #
    BrowserMatch "RealPlayer 4\.0" force-response-1.0
    BrowserMatch "Java/1\.0" force-response-1.0
    BrowserMatch "JDK/1\.0" force-response-1.0


# 浏览器定制标识结束

#
# 允许使用URL"http://servername/server-status"的形式查看服务器状态报告
# 修改 ".your_domain.com"来匹配相应的域名以激活此功能
#
#
#    SetHandler server-status
#    Order deny,allow
#    Deny from all
#    Allow from .your_domain.com
#

#
# 允许使用URL"://servername/server-info"(要求加载mod_info.c),
# 来远程察看服务器配置报告。
# 修改 ".your_domain.com"来匹配相应的域名以激活此功能
#
#
#    SetHandler server-info
#    Order deny,allow
#    Deny from all
#    Allow from .your_domain.com
#

#
# 据报有人试图利用一个老的1.1漏洞。
# 这个漏洞与CGI脚本在Apache服务器上分布有关。
# 通过取消下面几行的注释符,可以将此类攻击记录转移到phf.apache.org上的记录脚本上。
# 或者也可以利用脚本scriptsupport/phf_abuse_log.cgi记录在本地服务器上。
#
#
#    Deny from all
#    ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi
#

#
# 代理服务器标识。取消下列行的注释符可激活代理服务器。
#
#
#    ProxyRequests On

#   
#        Order deny,allow
#        Deny from all
#        Allow from .your_domain.com
#   

    #
    # 激活/取消处理HTTP/1.1 "Via:" 报头
    # ("Full":加入服务器版本; "Block":取消所有外发的Via: 报头)
    # 可设置值: Off | On | Full | Block
    #
#    ProxyVia On

    #
    # 可修改下列各行并取消注释符来激活缓存。
    # (没有CacheRoot标识就不使用缓存)
    #
#    CacheRoot "E:/Program Files/Apache Group/Apache/proxy"
#    CacheSize 5
#    CacheGcInterval 4
#    CacheMaxExpire 24
#    CacheLastModifiedFactor 0.1
#    CacheDefaultExpire 1
#    NoCache a_domain.com another_domain.edu joes.garage_sale.com

#
# 代理标识结束

### 部分 3: 虚拟主机
#
# 虚拟主机: 如果希望在一台服务器上实现多个域名和主机名的服务,
# 可设置VirtualHost来实现。Most configurations
# 大部分的设置使用基于名称的虚拟主机,这样服务器就不必为IP地址操心。
# 这些用星号在下面的标识中标出。
#
# 在试图设置虚拟主机前
# 请阅读<URL:http://www.apache.org/docs/vhosts/>中的文档。
# 以了解细节问题。
#
# 可用命令行参数 ‘-S’来确认虚拟主机的设置。
#

#
# 使用基于名称的虚拟主机
#
#NameVirtualHost *

#
# 虚拟主机实例:
# 几乎所有的Apache标识都可用于虚拟主机内。
# 第一个VirtualHost部分用于申请一个无重复的服务器名。
#
#