﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-华梦行-随笔分类-JDK</title><link>http://www.blogjava.net/huamengxing/category/25402.html</link><description>专注于java</description><language>zh-cn</language><lastBuildDate>Fri, 07 Sep 2012 04:19:12 GMT</lastBuildDate><pubDate>Fri, 07 Sep 2012 04:19:12 GMT</pubDate><ttl>60</ttl><item><title>遇到空白的处理</title><link>http://www.blogjava.net/huamengxing/archive/2012/09/07/387220.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Fri, 07 Sep 2012 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2012/09/07/387220.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/387220.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2012/09/07/387220.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/387220.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/387220.html</trackback:ping><description><![CDATA[遇到页面显示空白很有可能的一种原因就是编码不正确&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src ="http://www.blogjava.net/huamengxing/aggbug/387220.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2012-09-07 09:23 <a href="http://www.blogjava.net/huamengxing/archive/2012/09/07/387220.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文档流</title><link>http://www.blogjava.net/huamengxing/archive/2009/10/13/298083.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Tue, 13 Oct 2009 08:56:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2009/10/13/298083.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/298083.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2009/10/13/298083.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/298083.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/298083.html</trackback:ping><description><![CDATA[文档流是文档中可显示对象在排列时所占用的位置。比如网页的div标签它默认占用的宽度位置是一整行，p标签默认占用宽度也是一整行，因为div标签和p标签是块状对象。

网页中大部分对象默认是占用文档流，也有一些对象是不占文档流的，比如表单中隐藏域。当然我们也可以让占用文档流的元素转换成不占文档流，这就要用到CSS中属性position来控制。

看看CSS 2.0对position的定义：检索对象的定位方式。共有4种取值。

static：默认值，无特殊（静态）定位。对象遵循HTML定位规则 。 
absolute：绝对定位。将对象从文档流中拖出，使用left，right，top，bottom等属性相对于其最接近的一个最有定位设置的父对象进行绝对定位。如果不存在这样的父对象，则依据body对象。而其层叠通过z-index属性定义 。当对象定位在浏览器窗口以外，浏览器因此显示滚动条。 
fixed：固定定位。对象定位遵从绝对(absolute)方式。但是要遵守一些规范。当对象定位在浏览器窗口以外，浏览器不会因此显示滚动条，而当滚动条滚动时，对象始终固定在原来位置。 
relative：相对定位。对象不可层叠，但将依据left，right，top，bottom等属性在正常文档流中偏移位置。当对象定位在浏览器窗口以外，浏览器因此显示滚动条。 
inherit：继承值，对象将继承其父对象相应的值 <img src ="http://www.blogjava.net/huamengxing/aggbug/298083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2009-10-13 16:56 <a href="http://www.blogjava.net/huamengxing/archive/2009/10/13/298083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java NIO 类库Selector机制解析</title><link>http://www.blogjava.net/huamengxing/archive/2009/06/16/282599.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Tue, 16 Jun 2009 06:50:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2009/06/16/282599.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/282599.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2009/06/16/282599.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/282599.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/282599.html</trackback:ping><description><![CDATA[1）Sun的JVM在实现Selector上，在Linux和Windows平台下的细节。

2）Selector类的wakeup()方法如何唤醒阻塞在select()系统调用上的细节。

 

先给大家做一个简单的回顾，在Windows下，Sun的Java虚拟机在Selector.open()时会自己和自己建立loopback的TCP链接；在Linux下，Selector会创建pipe。这主要是为了Selector.wakeup()可以方便唤醒阻塞在select()系统调用上的线程（通过向自己所建立的TCP链接和管道上随便写点什么就可以唤醒阻塞线程）

 

我们知道，无论是建立TCP链接还是建立管道都会消耗系统资源，而在Windows上，某些Windows上的防火墙设置还可能会导致Java的Selector因为建立不起loopback的TCP链接而出现异常。

 

而在我的另一篇文章《用GDB调试Java程序》中介绍了另一个Java的解释器——GNU的gij，以及编译器gcj，不但可以比较高效地运行Java程序，而且还可以把Java程序直接编译成可执行文件。

 

GNU的之所以要重做一个Java的编译和解释器，其一个重要原因就是想解释Sun的JVM的效率和资源耗费问题。当然，GNU的Java编译/解释器并不需要考虑太多复杂的平台，他们只需要专注于Linux和衍生自Unix System V的操作系统，对于开发人员来说，离开了Windows，一切都会变得简单起来。在这里，让我们看看GNU的gij是如何解释Selector.open()和Selector.wakeup()的。

 

同样，我们需要一个测试程序。在这里，为了清晰，我不会例出所有的代码，我只给出我所使用的这个程序的一些关键代码。

 

我的这个测试程序中，和所有的Socket程序一样，下面是一个比较标准的框架，当然，这个框架应该是在一个线程中，也就是一个需要继承Runnable接口，并实现run()方法的一个类。（注意：其中的s是一个成员变量，是Selector类型，以便主线程序使用）

 

 

        //生成一个侦听端

        ServerSocketChannel ssc = ServerSocketChannel.open();

        //将侦听端设为异步方式

        ssc.configureBlocking(false);

        //生成一个信号监视器

        s = Selector.open();

        //侦听端绑定到一个端口

        ssc.socket().bind(new InetSocketAddress(port));

        //设置侦听端所选的异步信号OP_ACCEPT

        ssc.register(s,SelectionKey.OP_ACCEPT);

   

        System.out.println("echo server has been set up ......");

 

        while(true){

            int n = s.select();

            if (n == 0) { //没有指定的I/O事件发生

               continue;

            }     

            Iterator it = s.selectedKeys().iterator();     

            while (it.hasNext()) {

                SelectionKey key = (SelectionKey) it.next();

                if (key.isAcceptable()) { //侦听端信号触发

                     …… …… ……

                     …… …… ……

                }   

                if (key.isReadable()) { //某socket可读信号

                     …… …… ……

                     …… …… ……                    

                }     

                it.remove();

            }

         }





 

而在主线程中，我们可以通过Selector.wakeup()来唤醒这个阻塞在select()上的线程，下面是写在主线程中的唤醒程序：

 

 

new Thread(this).start();

try{

    //Sleep 30 seconds

    Thread.sleep(30000);

    System.out.println("wakeup the select");

    s.wakeup();

}catch(Exception e){

        e.printStackTrace();

}

 

 

这个程序在主线程中，先启动一个线程，也就是上面那个Socket线程，然后休息30秒，为的是让上面的那个线程有阻塞在select()，然后打印出一条信息，这是为了我们用strace命令查看具体的系统调用时能够快速定位。之后调用的是Selector的wakeup()方法来唤醒侦听线程。

 

接下来，我们可以通过两种方式来编译这个程序：

1）使用gcj或是sun的javac编译成class文件，然后使用gij解释执行。

2）使用gcj直接编译成可执行文件。

（无论你用那种方法，都是一样的结果，本文使用第二种方法，关于gcj的编译方法，请参看我的《用GDB调试Java程序》）

 

编译成可执行文件后，执行程序时，使用lsof命令，我们可以看到没有任何pipe的建立。可见GNU的解释更为的节省资源。而对于一个Unix的C程序员来说，这意味着如果要唤醒select()只能使用pthread_kill()来发送一个信号了。下面就让我们使用strace命令来验证这个想法。

 

下图是使用strace命令来跟踪整个程序运行时的系统调用，我们利用我们的输出的“wakeup the select”字符串快速的找到了wakeup的实际系统调用。

<img src ="http://www.blogjava.net/huamengxing/aggbug/282599.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2009-06-16 14:50 <a href="http://www.blogjava.net/huamengxing/archive/2009/06/16/282599.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat6使用nio</title><link>http://www.blogjava.net/huamengxing/archive/2009/06/16/282594.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Tue, 16 Jun 2009 06:30:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2009/06/16/282594.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/282594.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2009/06/16/282594.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/282594.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/282594.html</trackback:ping><description><![CDATA[很早就听说tomcat6使用nio了，这几天突然想到一个问题，使用nio代替传统的bio，ThreadLocal岂不是会存在冲突？ 
　　如果读者有socket的编程基础，应该会接触过堵塞socket和非堵塞socket，堵塞socket就是在accept、read、write等IO操作的的时候，如果没有可用符合条件的资源，不马上返回，一直等待直到有资源为止。而非堵塞socket则是在执行select的时候，当没有资源的时候堵塞，当有符合资源的时候，返回一个信号，然后程序就可以执行accept、read、write等操作，这个时候，这些操作是马上完成，并且马上返回。而windows的winsock则有所不同，可以绑定到一个EventHandle里，也可以绑定到一个HWND里，当有资源到达时，发出事件，这时执行的io操作也是马上完成、马上返回的。一般来说，如果使用堵塞socket，通常我们时开一个线程accept socket，当有socket链接的时候，开一个单独的线程处理这个socket；如果使用非堵塞socket，通常是只有一个线程，一开始是select状态，当有信号的时候马上处理，然后继续select状态。 

　按照大多数人的说法，堵塞socket比非堵塞socket的性能要好。不过也有小部分人并不是这样认为的，例如Indy项目（Delphi一个比较出色的网络包），它就是使用多线程＋堵塞socket模式的。另外，堵塞socket比非堵塞socket容易理解，符合一般人的思维，编程相对比较容易。　　 
　　nio其实也是类似上面的情况。在JDK1.4，sun公司大范围提升Java的性能，其中NIO就是其中一项。Java的IO操作集中在java.io这个包中，是基于流的阻塞API（即BIO，Block IO）。对于大多数应用来说，这样的API使用很方便，然而，一些对性能要求较高的应用，尤其是服务端应用，往往需要一个更为有效的方式来处理IO。从JDK 1.4起，NIO API作为一个基于缓冲区，并能提供非阻塞O操作的API（即NIO，non-blocking IO）被引入。　　BIO与NIO一个比较重要的不同，是我们使用BIO的时候往往会引入多线程，每个连接一个单独的线程；而NIO则是使用单线程或者只使用少量的多线程，每个连接共用一个线程。  
　　这个时候，问题就出来了：我们非常多的java应用是使用ThreadLocal的，例如JSF的FaceContext、Hibernate的session管理、Struts2的Context的管理等等，几乎所有框架都或多或少地应用ThreadLocal。如果存在冲突，那岂不惊天动地？ 
　　　后来终于在Tomcat6的文档（http://tomcat.apache.org/tomcat-6.0-doc/aio.html）找到答案。根据上面说明，应该Tomcat6应用nio只是用在处理发送、接收信息的时候用到，也就是说，tomcat6还是传统的多线程Servlet，我画了下面两个图来列出区别： 
　　tomcat5：客户端连接到达 -> 传统的SeverSocket.accept接收连接 -> 从线程池取出一个线程 -> 在该线程读取文本并且解析HTTP协议 -> 在该线程生成ServletRequest、ServletResponse，取出请求的Servlet -> 在该线程执行这个Servlet -> 在该线程把ServletResponse的内容发送到客户端连接 -> 关闭连接。 　　 
　　我以前理解的使用nio后的tomcat6：客户端连接到达 -> nio接收连接 -> nio使用轮询方式读取文本并且解析HTTP协议（单线程） -> 生成ServletRequest、ServletResponse，取出请求的Servlet -> 直接在本线程执行这个Servlet -> 把ServletResponse的内容发送到客户端连接 -> 关闭连接。

实际的tomcat6：客户端连接到达 -> nio接收连接 -> nio使用轮询方式读取文本并且解析HTTP协议（单线程） -> 生成ServletRequest、ServletResponse，取出请求的Servlet -> 从线程池取出线程，并在该线程执行这个Servlet -> 把ServletResponse的内容发送到客户端连接 -> 关闭连接。 　 

　从上图可以看出，BIO与NIO的不同，也导致进入客户端处理线程的时刻有所不同：tomcat5在接受连接后马上进入客户端线程，在客户端线程里解析HTTP协议，而tomcat6则是解析完HTTP协议后才进入多线程，另外，tomcat6也比5早脱离客户端线程的环境。 
　　实际的tomcat6与我之前猜想的差别主要集中在如何处理servlet的问题上。实际上即使抛开ThreadLocal的问题，我之前理解tomcat6只使用一个线程处理的想法其实是行不同的。大家都有经验：servlet是基于BIO的，执行期间会存在堵塞的，例如读取文件、数据库操作等等。tomcat6使用了nio，但不可能要求servlet里面要使用nio，而一旦存在堵塞，效率自然会锐降。 
　　所以，最终的结论当然是tomcat6的servlet里面，ThreadLocal照样可以使用，不存在冲突<img src ="http://www.blogjava.net/huamengxing/aggbug/282594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2009-06-16 14:30 <a href="http://www.blogjava.net/huamengxing/archive/2009/06/16/282594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Object 转换 为int 类型的数据</title><link>http://www.blogjava.net/huamengxing/archive/2009/03/14/259723.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Sat, 14 Mar 2009 07:21:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2009/03/14/259723.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/259723.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2009/03/14/259723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/259723.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/259723.html</trackback:ping><description><![CDATA[Integer.parseInt(String.valueOf(o));<img src ="http://www.blogjava.net/huamengxing/aggbug/259723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2009-03-14 15:21 <a href="http://www.blogjava.net/huamengxing/archive/2009/03/14/259723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>请求的转发</title><link>http://www.blogjava.net/huamengxing/archive/2009/02/15/254760.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Sun, 15 Feb 2009 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2009/02/15/254760.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/254760.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2009/02/15/254760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/254760.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/254760.html</trackback:ping><description><![CDATA[req.getDispatcher("/a/b/c.jsp").forward(req,res);<img src ="http://www.blogjava.net/huamengxing/aggbug/254760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2009-02-15 15:36 <a href="http://www.blogjava.net/huamengxing/archive/2009/02/15/254760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java  connection经典代码</title><link>http://www.blogjava.net/huamengxing/archive/2009/02/13/254527.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Fri, 13 Feb 2009 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2009/02/13/254527.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/254527.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2009/02/13/254527.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/254527.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/254527.html</trackback:ping><description><![CDATA[try{   <br />          ……       <br />          con.setAutoCommit(false);   <br />          ……     //执行你的任务   <br />          ……   <br />          con.commit();   <br />          con.setAutoCommit(true);   <br />    <br />  }catch(SQLException   ex)   {   <br />          System.err.println("SQLException:   "   +   ex.getMessage());   <br />                  if   (con   !=   null)   {   <br />      try   {   <br />          System.err.print("Transaction   is   being   ");   <br />          System.err.println("rolled   back");   <br />          con.rollback();   <br />        }   catch(SQLException   excep)   {   <br />  System.err.print("SQLException:   ");   <br />  System.err.println(excep.getMessage());   <br />  }   <br />  }   <br />  }<br />finaly{<br />try{<br />if(con   !=   null){<br />con.close();<br />}<br />setAutoCommit(false)之后，你必须手工调用commit   或者   rollback来确认事务是提交还是回滚   <br />  最好再调用setAutoCommit(true)来关闭事务状态再close连接<img src ="http://www.blogjava.net/huamengxing/aggbug/254527.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2009-02-13 11:42 <a href="http://www.blogjava.net/huamengxing/archive/2009/02/13/254527.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从配置文件中获取数据库连接</title><link>http://www.blogjava.net/huamengxing/archive/2009/01/09/250629.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Fri, 09 Jan 2009 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2009/01/09/250629.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/250629.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2009/01/09/250629.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/250629.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/250629.html</trackback:ping><description><![CDATA[  ServletContext context = servlet.getServletContext();<br />      <br /> DataSource ds = (DataSource)context.getAttribute("dataSource");<br />从配置文件中获取数据库连接<br />       <img src ="http://www.blogjava.net/huamengxing/aggbug/250629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2009-01-09 10:27 <a href="http://www.blogjava.net/huamengxing/archive/2009/01/09/250629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>日期的格式化</title><link>http://www.blogjava.net/huamengxing/archive/2008/12/19/247312.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Fri, 19 Dec 2008 04:54:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2008/12/19/247312.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/247312.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2008/12/19/247312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/247312.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/247312.html</trackback:ping><description><![CDATA[
		<br />  Date t= DateFormat.getDateInstance(DateFormat.DATE_FIELD, Locale.CHINA).parse("2009-1-8");<br />  SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式<br />       System.out.println(df.format(t));<img src ="http://www.blogjava.net/huamengxing/aggbug/247312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2008-12-19 12:54 <a href="http://www.blogjava.net/huamengxing/archive/2008/12/19/247312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jdk相关下载</title><link>http://www.blogjava.net/huamengxing/archive/2008/10/17/234883.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Fri, 17 Oct 2008 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2008/10/17/234883.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/234883.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2008/10/17/234883.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/234883.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/234883.html</trackback:ping><description><![CDATA[
		<div>
				<p>JDK1.6官方下载_JDK6官方下载地址:<a href="http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe" target="_blank"><font color="#0000ff">http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe</font></a></p>
				<p>
						<font color="#0000ff">
						</font>
				</p>
				<p>
						<font color="#0000ff">
								<font color="#000000">JDK6 API CHM中文参考下载:</font>
						</font>
				</p>
				<p>
						<u>
								<font color="#0000ff">JDK6API中文参考070114.rar :</font>
						</u>
						<a href="http://chinesedocument.com/upimg/soft/JDK6API中文参考070114.rar" target="_blank">
								<font color="#0000ff">http://chinesedocument.com/upimg/soft/JDK6API中文参考070114.rar</font>
						</a>
				</p>
				<p>Java SE 6 API 中文版 CHM 下载:<a href="http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/chm/JDK_API_1_6_zh_CN.CHM" target="_blank"><font color="#0000ff">http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/chm/JDK_API_1_6_zh_CN.CHM</font></a></p>
				<p>Java SE 5 API 中文版 CHM 下载:<a href="http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/builds/JDK_API_1_5_zh_CN.CHM" target="_blank"><font color="#0000ff">http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/builds/JDK_API_1_5_zh_CN.CHM</font></a></p>
				<p>JDK6 API 中文版下载:</p>
				<p>
				</p>
				<table class="FCK__ShowTableBorders" style="TABLE-LAYOUT: fixed">
						<tbody>
								<tr>
										<td>
												<div class="cnt">
														<p>
																<span class="javascript">
																		<a class="ilink" href="https://jdk-api-zh-cn.dev.java.net/" target="_blank">
																				<font color="#004080">https://jdk-api-zh-cn.dev.java.net/</font>
																		</a>
																		<br />
																		<br />JDK6 API 中文版 HTML 格式在线文档：<a href="http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/builds/latest/html/zh_CN/api/" target="_blank"><font color="#0000ff">http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/builds/latest/html/zh_CN/api/</font></a><br />JDK6 API 中文版zip 格式下载： <a class="ilink" href="http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/builds/latest/html_zh_CN.zip" target="_blank"><font color="#0000ff">http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/builds/latest/html_zh_CN.zip</font></a></span>
														</p>
														<span class="javascript">
																<div class="postTitle">
																		<p>
																		</p>
																		<p>JDK 1.6 API下载地址:</p>
																		<p>
																				<a href="http://blog.csdn.net/taosst/archive/2007/09/28/1804718.aspx" target="_blank">
																						<font color="#810081">SUN官方API中文版【JDK1.6】</font>
																				</a>
																		</p>
																</div>
																<div class="postText">1.6API文档（中文）的下载地址： 
<p>ZIP格式：<a href="http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/html_zh_CN.zip" target="_blank"><font color="#824db5">http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/html_zh_CN.zip</font></a></p><p>CHM格式：<a href="http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/chm/JDK_API_1_6_zh_CN.CHM"><font color="#0e61b2">http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/chm/JDK_API_1_6_zh_CN.CHM</font></a></p></div>
														</span>
												</div>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
<img src ="http://www.blogjava.net/huamengxing/aggbug/234883.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2008-10-17 13:53 <a href="http://www.blogjava.net/huamengxing/archive/2008/10/17/234883.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>汉字编码问题</title><link>http://www.blogjava.net/huamengxing/archive/2008/10/16/234651.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Thu, 16 Oct 2008 02:36:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2008/10/16/234651.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/234651.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2008/10/16/234651.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/234651.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/234651.html</trackback:ping><description><![CDATA[
		<font face="宋体"> 由于常常要和汉字处理打交道，因此，我常常受到汉字编码问题的困扰。在不断的打击与坚持中，也积累了一点汉字编码方面的经验，想和大家一起分享。</font>
		<p class="MsoNormal">
				<span style="COLOR: black; FONT-FAMILY: 宋体">一、汉字编码的种类</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">    </span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">汉字编码中现在主要用到的有三类，包括<span lang="EN-US">GBK</span>，<span lang="EN-US">GB2312</span>和<span lang="EN-US">Big5</span>。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">    1</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">、<span lang="EN-US">GB2312</span>又称国标码，</span>
				<span style="FONT-FAMILY: 宋体">由国家标准总局发布，</span>
				<span lang="EN-US">1981</span>
				<span style="FONT-FAMILY: 宋体">年</span>
				<span lang="EN-US">5</span>
				<span style="FONT-FAMILY: 宋体">月</span>
				<span lang="EN-US">1</span>
				<span style="FONT-FAMILY: 宋体">日实施，通行于大陆。新加坡等地也使用此编码。它是一个简化字的编码规范，当然也包括其他的符号、字母、日文假名等，共</span>
				<span lang="EN-US">7445</span>
				<span style="FONT-FAMILY: 宋体">个图形字符，其中汉字占</span>
				<span lang="EN-US">6763</span>
				<span style="FONT-FAMILY: 宋体">个。我们平时说</span>
				<span lang="EN-US">6768</span>
				<span style="FONT-FAMILY: 宋体">个汉字，实际上里边有</span>
				<span lang="EN-US">5</span>
				<span style="FONT-FAMILY: 宋体">个编码为空白，所以总共有</span>
				<span lang="EN-US">6763</span>
				<span style="FONT-FAMILY: 宋体">个汉字。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">      GB2312</span>
				<span style="FONT-FAMILY: 宋体">规定“对任意一个图形字符都采用两个字节表示，每个字节均采用七位编码表示”，习惯上称第一个字节为“高字节”，第二个字节为“低字节”。</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">GB2312</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">中汉字的编码范围为，第一字节<span lang="EN-US">0xB0-0xF7(</span>对应十进制为<span lang="EN-US">176-247)</span>，第二个字节<span lang="EN-US">0xA0-0xFE</span>（对应十进制为<span lang="EN-US">160-254</span>）。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">    </span>
				<span lang="EN-US">GB2312</span>
				<span style="FONT-FAMILY: 宋体">将代码表分为</span>
				<span lang="EN-US">94</span>
				<span style="FONT-FAMILY: 宋体">个区，对应第一字节（</span>
				<span lang="EN-US" style="FONT-FAMILY: 宋体">0xa1-0xfe</span>
				<span style="FONT-FAMILY: 宋体">）；每个区</span>
				<span lang="EN-US">94</span>
				<span style="FONT-FAMILY: 宋体">个位（</span>
				<span lang="EN-US" style="FONT-FAMILY: 宋体">0xa1-0xfe</span>
				<span style="FONT-FAMILY: 宋体">），对应第二字节，两个字节的值分别为区号值和位号值加</span>
				<span lang="EN-US">32</span>
				<span style="FONT-FAMILY: 宋体">（</span>
				<span lang="EN-US">2OH</span>
				<span style="FONT-FAMILY: 宋体">），因此也称为区位码。</span>
				<span lang="EN-US">01-09</span>
				<span style="FONT-FAMILY: 宋体">区为符号、数字区，</span>
				<span lang="EN-US">16-87</span>
				<span style="FONT-FAMILY: 宋体">区为汉字区（</span>
				<span lang="EN-US" style="FONT-FAMILY: 宋体">0xb0-0xf7</span>
				<span style="FONT-FAMILY: 宋体">），</span>
				<span lang="EN-US">10-15</span>
				<span style="FONT-FAMILY: 宋体">区、</span>
				<span lang="EN-US">88-94</span>
				<span style="FONT-FAMILY: 宋体">区是有待进一步标准化的空白区。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
				</span> </p>
		<p class="MsoNormal">
				<span lang="EN-US">       2</span>
				<span style="FONT-FAMILY: 宋体">、</span>
				<span lang="EN-US">Big5</span>
				<span style="FONT-FAMILY: 宋体">又称大五码，主要为香港与台湾使用，即是一个繁体字编码。</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">每个汉字由两个字节构成，第一个字节的范围从</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">0X81</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">－</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">0XFE</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">（即</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">129-255</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">），共</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">126</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">种。第二个字节的范围不连续，分别为</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">0X40</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">－</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">0X7E</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">（即</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">64-126</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">），</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">0XA1</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">－</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">0XFE</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">（即</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">161-254</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">），共</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">157</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">种。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">
				</span> </p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">    3</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">、<span lang="EN-US">GBK</span>是<span lang="EN-US">GB2312</span>的扩展，是向上兼容的，因此<span lang="EN-US">GB2312</span>中的汉字的编码与<span lang="EN-US">GBK</span>中汉字的相同。另外，<span lang="EN-US">GBK</span>中还包含繁体字的编码，它与<span lang="EN-US">Big5</span>编码之间的关系我还没有弄明白，好像是不一致的。<span lang="EN-US">GBK</span>中每个汉字仍然包含两个字节，第一个字节的范围是<span lang="EN-US">0x81-0xFE</span>（即<span lang="EN-US">129-254</span>），第二个字节的范围是<span lang="EN-US">0x40-0xFE</span>（即<span lang="EN-US">64-254</span>）。<span lang="EN-US">GBK</span>中有码位<span lang="EN-US">23940</span>个，包含汉字<span lang="EN-US">21003</span>个。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">                                     </span>
		</p>
		<p class="MsoNormal">
				<span lang="en-us" style="FONT-FAMILY: 宋体">                                   </span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">表<span lang="EN-US">1 </span>汉字编码范围</span>
		</p>
		<table class="MsoTableGrid" id="table1" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN-LEFT: 50.4pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1">
				<tbody>
						<tr>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 81pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="108">
										<p class="MsoNormal">
												<span style="COLOR: black; FONT-FAMILY: 宋体">名称</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="192">
										<p class="MsoNormal">
												<span style="COLOR: black; FONT-FAMILY: 宋体">第一字节</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 153pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="204">
										<p class="MsoNormal">
												<span style="COLOR: black; FONT-FAMILY: 宋体">第二字节</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 81pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="108">
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">GB2312</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="192">
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">0xB0-0xF7(176-247) </span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 153pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="204">
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">0xA0-0xFE</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">（</span>
												<span lang="EN-US" style="COLOR: black">160-254</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">）</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 81pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="108">
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">GBK</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="192">
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">0x81-0xFE</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">（</span>
												<span lang="EN-US" style="COLOR: black">129-254</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">）</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 153pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="204">
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">0x40-0xFE</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">（</span>
												<span lang="EN-US" style="COLOR: black">64-254</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">）</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 81pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="108">
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">Big5</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="192">
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">0x81-0xFE</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">（</span>
												<span lang="EN-US" style="COLOR: black">129-255</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">）</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 153pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="204">
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">0x40-0x7E</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">（</span>
												<span lang="EN-US" style="COLOR: black">64-126</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">）</span>
										</p>
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">0xA1</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">－</span>
												<span lang="EN-US" style="COLOR: black">0xFE</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">（</span>
												<span lang="EN-US" style="COLOR: black">161-254</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">）</span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">
				</span> </p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">
				</span> </p>
		<p class="MsoNormal">
				<span style="COLOR: black; FONT-FAMILY: 宋体">二、对汉字进行<span lang="EN-US">hash</span></span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">    </span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">为了处理汉字的方便，在查找汉字的时候，我们通常会用到<span lang="EN-US">hash</span>的方法，那怎么来确定一个汉字位置呢？这就和每种编码的排列有关了，这里主要给出一种<span lang="EN-US">hash</span>函数的策略。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">    </span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">对于<span lang="EN-US">GB2312</span>编码，设输入的汉字为<span lang="EN-US">GBword</span>，我们可以采用公式<span lang="EN-US">(C1-176)*94 + (C2-161)</span>确定<span lang="EN-US">GBindex</span>。其中，<span lang="EN-US">C1</span>表示第一字节，<span lang="EN-US">C2</span>表示第二字节。具体如下：</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="COLOR: #3700c8; FONT-FAMILY: Fixedsys">    GBindex = ((unsigned char)GBword.at(0)-176)*94 + (unsigned char)GBword.at(1) - 161;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">    </span>
				<span style="FONT-FAMILY: 宋体">之所以用<span lang="EN-US">unsigned char</span>类型，是因为<span lang="EN-US">char</span>是一个字节，如果用<span lang="EN-US">unsigend int</span>，因为<span lang="EN-US">int</span>是<span lang="EN-US">4</span>个字节的，所以会造成扩展，导致错误。</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 18.05pt; TEXT-INDENT: -35.9pt; TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">       </span>
				<span style="FONT-FAMILY: 宋体">对于<span lang="EN-US">GBK</span>编码，设输入的汉字为<span lang="EN-US">GBKword</span>，则可以采用公式<span lang="EN-US">   </span></span>
				<span lang="EN-US" style="FONT-FAMILY: 宋体">index=(ch1-0x81)*190+(ch2-0x40)-(ch2/128)</span>
				<span style="FONT-FAMILY: 宋体">，其中<span lang="EN-US">ch1</span>是第一字节，<span lang="EN-US">ch2</span>是第二字节。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">    </span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">具体的，</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3700c8; FONT-FAMILY: Fixedsys">    GBKindex = ((unsigned char)GBKword[0]-129)*190 +</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3700c8; FONT-FAMILY: Fixedsys">               ((unsigned char)GBKword[1]-64) - (unsigned char)GBKword[1]/128;</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">
				</span> </p>
		<p class="MsoNormal">
				<span style="COLOR: black; FONT-FAMILY: 宋体">三、怎样判断一个汉字的是什么编码</span>
		</p>
		<p class="MsoNormal">
				<span style="COLOR: black; FONT-FAMILY: 宋体">直接根据汉字的编码范围判断，对于<span lang="EN-US">GB2312</span>和<span lang="EN-US">GBK</span>可用下面两个程序实现。</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">1</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">、判断是否是<span lang="EN-US">GB2312</span></span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">bool isGBCode(const string&amp; strIn)</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">{</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">    unsigned char ch1;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">    unsigned char ch2;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">    </span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">    if (strIn.size() &gt;= 2)</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">    {</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">        ch1 = (unsigned char)strIn.at(0);</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">        ch2 = (unsigned char)strIn.at(1);</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">        if (ch1&gt;=176 &amp;&amp; ch1&lt;=247 &amp;&amp; ch2&gt;=160 &amp;&amp; ch2&lt;=254)</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">            return true;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">        else return false;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">    }</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">    else return false;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">}</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">2</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">、判断是否是<span lang="EN-US">GBK</span>编码</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">bool isGBKCode(const string&amp; strIn)</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">{</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">    unsigned char ch1;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">    unsigned char ch2;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">    </span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">    </span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">if (strIn.size() &gt;= 2)</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">    {</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">        </span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">ch1 = (unsigned char)strIn.at(0);</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">        ch2 = (unsigned char)strIn.at(1);</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">        if (ch1&gt;=129 &amp;&amp; ch1&lt;=254 &amp;&amp; ch2&gt;=64 &amp;&amp; ch2&lt;=254)</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">            return true;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">        else return false;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">    }</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">    else return false;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">}</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">
				</span> </p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">3</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">、对于<span lang="EN-US">Big5</span></span>
		</p>
		<p class="MsoPlainText">
				<span lang="EN-US">    </span>它的范围为：高字节从<span lang="EN-US">0xA0</span>到<span lang="EN-US">0xFE</span>，低字节从<span lang="EN-US">0x40</span>到<span lang="EN-US">0x7E</span>，和<span lang="EN-US">0xA1</span>到<span lang="EN-US">0xFE</span>两部分。判断一个汉字是否是<span lang="EN-US">BIG5</span>编码，可以如上对字符的编码范围判断即可。如何定位呢？那么也想象所有编码排列为一个二维坐标，纵坐标是高字节，横坐标是低字节。这样一行上的汉字个数：<span lang="EN-US">(0x7E-0x40+1)+(0xFE-0xA1+1)</span>＝<span lang="EN-US">157</span>。那么定位算法分两块，为<span lang="EN-US">:  </span></p>
		<p class="MsoPlainText">
				<span lang="EN-US">    if 0x40&lt;=ch2&lt;=0x7E: #is big5 char </span>
		</p>
		<p class="MsoPlainText">    <span lang="PT-BR">index=((ch1-0xA1)*157+(ch2-0x40))*2 </span></p>
		<p class="MsoPlainText">
				<span lang="EN-US">    elif 0xA1&lt;=ch2&lt;=0xFE: #is big5 char </span>
		</p>
		<p class="MsoPlainText">    <span lang="PT-BR">index=((ch1-0xA1)*157+(ch2-0xA1+63))*2 </span></p>
		<p class="MsoPlainText">
				<span lang="PT-BR">
				</span> </p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">对于第二块，计算偏移量时因为有两块数值，所以在计算后面一段值时，不要忘了前面还有一段值。<span lang="EN-US">0x7E-0x40+1=63</span>。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">
				</span> </p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">四、如果判断一个字符是西文字符还是中文字符</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">    </span>
				<span style="FONT-FAMILY: 宋体">大家知道西文字符主要是指</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">ASCII</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">码，它用一个字节表示。且这个字符转换成数字之后，该数字是大于<span lang="EN-US">0</span>的，而汉字是两个字节的，第一个字节的转化为数字之后应该是小于<span lang="EN-US">0</span>的，因此可以根据每个字节转化为数字之后是否小于<span lang="EN-US">0</span>，判断它是否是汉字。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">    </span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">例如，设输入字为<span lang="EN-US">strin</span>，则，</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">     If (strin.at(0) &lt; 0)</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">       cout &lt;&lt; ”</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">是汉字<span lang="EN-US">” &lt;&lt; endl;</span></span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">     else cout &lt;&lt; ”</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">不是汉字<span lang="EN-US">” &lt;&lt; endl;</span></span>
		</p>
		<p class="MsoNormal">　</p>
		<p class="MsoNormal">
				<span lang="en-us" style="FONT-FAMILY: 宋体">五、编码表下载</span>
		</p>
		<p class="MsoNormal">
				<span lang="en-us" style="FONT-FAMILY: 宋体">   GBK编码表，<a href="http://users.ir-lab.org/~taozi/GBK1.txt">下载</a></span>
		</p>
		<p class="MsoNormal">
				<span lang="en-us" style="FONT-FAMILY: 宋体">   GB2312编码表，<a href="http://users.ir-lab.org/~taozi/Gb2312.TXT">下载</a></span>
		</p>
<img src ="http://www.blogjava.net/huamengxing/aggbug/234651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2008-10-16 10:36 <a href="http://www.blogjava.net/huamengxing/archive/2008/10/16/234651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用的JavaScript验证正则表达式</title><link>http://www.blogjava.net/huamengxing/archive/2008/10/16/234650.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Thu, 16 Oct 2008 02:34:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2008/10/16/234650.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/234650.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2008/10/16/234650.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/234650.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/234650.html</trackback:ping><description><![CDATA[
		<p>下面都是我收集的一些比较常用的正则表达式，因为平常可能在表单验证的时候，用到的比较多。特发出来，让各位朋友共同使用。呵呵。</p>
		<p>匹配中文字符的正则表达式： [u4e00-u9fa5]<br />评注：匹配中文还真是个头疼的事，有了这个表达式就好办了</p>
		<p>匹配双字节字符(包括汉字在内)：[^x00-xff]<br />评注：可以用来计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）</p>
		<p>匹配空白行的正则表达式：ns*r<br />评注：可以用来删除空白行</p>
		<p>匹配HTML标记的正则表达式：&lt; (S*?)[^&gt;]*&gt;.*?|&lt; .*? /&gt;<br />评注：网上流传的版本太糟糕，上面这个也仅仅能匹配部分，对于复杂的嵌套标记依旧无能为力</p>
		<p>匹配首尾空白字符的正则表达式：^s*|s*$<br />评注：可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等)，非常有用的表达式</p>
		<p>
				<span id="more-61">
				</span>
		</p>
		<p>
				<code>
						<br />匹配Email地址的正则表达式：w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*<br />评注：表单验证时很实用</code>
		</p>
		<p>匹配网址URL的正则表达式：[a-zA-z]+://[^s]*<br />评注：网上流传的版本功能很有限，上面这个基本可以满足需求</p>
		<p>匹配帐号是否合法(字母开头，允许5-16字节，允许字母数字下划线)：^[a-zA-Z][a-zA-Z0-9_]{4,15}$<br />评注：表单验证时很实用</p>
		<p>匹配国内电话号码：d{3}-d{8}|d{4}-d{7}<br />评注：匹配形式如 0511-4405222 或 021-87888822</p>
		<p>匹配腾讯QQ号：[1-9][0-9]{4,}<br />评注：腾讯QQ号从10000开始</p>
		<p>匹配中国邮政编码：[1-9]d{5}(?!d)<br />评注：中国邮政编码为6位数字</p>
		<p>匹配身份证：d{15}|d{18}<br />评注：中国的身份证为15位或18位</p>
		<p>匹配ip地址：d+.d+.d+.d+<br />评注：提取ip地址时有用</p>
		<p>匹配特定数字：<br />^[1-9]d*$　 　 //匹配正整数<br />^-[1-9]d*$ 　 //匹配负整数<br />^-?[1-9]d*$　　 //匹配整数<br />^[1-9]d*|0$　 //匹配非负整数（正整数 + 0）<br />^-[1-9]d*|0$　　 //匹配非正整数（负整数 + 0）<br />^[1-9]d*.d*|0.d*[1-9]d*$　　 //匹配正浮点数<br />^-([1-9]d*.d*|0.d*[1-9]d*)$　 //匹配负浮点数<br />^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$　 //匹配浮点数<br />^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$　　 //匹配非负浮点数（正浮点数 + 0）<br />^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$　　//匹配非正浮点数（负浮点数 + 0）<br />评注：处理大量数据时有用，具体应用时注意修正</p>
		<p>匹配特定字符串：<br />^[A-Za-z]+$　　//匹配由26个英文字母组成的字符串<br />^[A-Z]+$　　//匹配由26个英文字母的大写组成的字符串<br />^[a-z]+$　　//匹配由26个英文字母的小写组成的字符串<br />^[A-Za-z0-9]+$　　//匹配由数字和26个英文字母组成的字符串<br />^w+$　　//匹配由数字、26个英文字母或者下划线组成的字符串</p>
		<p>在使用RegularExpressionValidator验证控件时的验证功能及其验证表达式介绍如下:</p>
		<p>只能输入数字：“^[0-9]*$”<br />只能输入n位的数字：“^d{n}$”<br />只能输入至少n位数字：“^d{n,}$”<br />只能输入m-n位的数字：“^d{m,n}$”<br />只能输入零和非零开头的数字：“^(0|[1-9][0-9]*)$”<br />只能输入有两位小数的正实数：“^[0-9]+(.[0-9]{2})?$”<br />只能输入有1-3位小数的正实数：“^[0-9]+(.[0-9]{1,3})?$”<br />只能输入非零的正整数：“^+?[1-9][0-9]*$”<br />只能输入非零的负整数：“^-[1-9][0-9]*$”<br />只能输入长度为3的字符：“^.{3}$”<br />只能输入由26个英文字母组成的字符串：“^[A-Za-z]+$”<br />只能输入由26个大写英文字母组成的字符串：“^[A-Z]+$”<br />只能输入由26个小写英文字母组成的字符串：“^[a-z]+$”<br />只能输入由数字和26个英文字母组成的字符串：“^[A-Za-z0-9]+$”<br />只能输入由数字、26个英文字母或者下划线组成的字符串：“^w+$”<br />验证用户密码:“^[a-zA-Z]w{5,17}$”正确格式为：以字母开头，长度在6-18之间，</p>
		<p>只能包含字符、数字和下划线。<br />验证是否含有^%&amp;’,;=?$”等字符：“[^%&amp;',;=?$x22]+”<br />只能输入汉字：“^[u4e00-u9fa5],{0,}$”<br />验证Email地址：“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$”<br />验证InternetURL：“^http://([w-]+.)+[w-]+(/[w-./?%&amp;=]*)?$”<br />验证电话号码：“^((d{3,4})|d{3,4}-)?d{7,8}$”</p>
		<p>正确格式为：“XXXX-XXXXXXX”，“XXXX-XXXXXXXX”，“XXX-XXXXXXX”，</p>
		<p>“XXX-XXXXXXXX”，“XXXXXXX”，“XXXXXXXX”。<br />验证身份证号（15位或18位数字）：“^d{15}|d{}18$”<br />验证一年的12个月：“^(0?[1-9]|1[0-2])$”正确格式为：“01”-“09”和“1”“12”<br />验证一个月的31天：“^((0?[1-9])|((1|2)[0-9])|30|31)$”</p>
		<p>正确格式为：“01”“09”和“1”“31”。</p>
		<p>匹配中文字符的正则表达式： [u4e00-u9fa5]<br />匹配双字节字符(包括汉字在内)：[^x00-xff]<br />匹配空行的正则表达式：n[s| ]*r<br />匹配HTML标记的正则表达式：/&lt; (.*)&gt;.*|&lt; (.*) /&gt;/<br />匹配首尾空格的正则表达式：(^s*)|(s*$)<br />匹配Email地址的正则表达式：w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*<br />匹配网址URL的正则表达式：http://([w-]+.)+[w-]+(/[w- ./?%&amp;=]*)?</p>
		<p>(1)应用：计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）<br />String.prototype.len=function(){return this.replace([^x00-xff]/g,”aa”).length;}</p>
		<p>(2)应用：javascript中没有像vbscript那样的trim函数，我们就可以利用这个表达式来实现<br />String.prototype.trim = function()<br />{<br />return this.replace(/(^s*)|(s*$)/g, “”);<br />}<br />(3)应用：利用正则表达式分解和转换IP地址<br />function IP2V(ip) //IP地址转换成对应数值<br />{<br />re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正则表达式<br />if(re.test(ip))<br />{<br />return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1<br />}<br />else<br />{<br />throw new Error(”Not a valid IP address!”)<br />}<br />}<br />(4)应用：从URL地址中提取文件名的javascript程序<br />s=”http://www.9499.net/page1.htm”;<br />s=s.replace(/(.*/){0,}([^.]+).*/ig,”$2″) ; //Page1.htm<br />(5)应用：利用正则表达式限制网页表单里的文本框输入内容<br />用正则表达式限制只能输入中文：onkeyup=”value=”/blog/value.replace(/["^u4E00-u9FA5]/g,”) ” onbeforepaste=”clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^u4E00-u9FA5]/g,”))”<br />用正则表达式限制只能输入全角字符： onkeyup=”value=”/blog/value.replace(/["^uFF00-uFFFF]/g,”) ” onbeforepaste=”clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^uFF00-uFFFF]/g,”))”<br />用正则表达式限制只能输入数字：onkeyup=”value=”/blog/value.replace(/["^d]/g,”) “onbeforepaste= “clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^d]/g,”))”<br />用正则表达式限制只能输入数字和英文：onkeyup=”value=”/blog/value.replace(/[W]/g,””) “onbeforepaste=”clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^d]/g,”<br /></p>
<img src ="http://www.blogjava.net/huamengxing/aggbug/234650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2008-10-16 10:34 <a href="http://www.blogjava.net/huamengxing/archive/2008/10/16/234650.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>汉字编码问题</title><link>http://www.blogjava.net/huamengxing/archive/2008/10/16/234639.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Thu, 16 Oct 2008 02:03:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2008/10/16/234639.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/234639.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2008/10/16/234639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/234639.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/234639.html</trackback:ping><description><![CDATA[
		<font face="宋体"> 由于常常要和汉字处理打交道，因此，我常常受到汉字编码问题的困扰。在不断的打击与坚持中，也积累了一点汉字编码方面的经验，想和大家一起分享。</font>
		<p class="MsoNormal">
				<span style="COLOR: black; FONT-FAMILY: 宋体">一、汉字编码的种类</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">    </span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">汉字编码中现在主要用到的有三类，包括<span lang="EN-US">GBK</span>，<span lang="EN-US">GB2312</span>和<span lang="EN-US">Big5</span>。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">    1</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">、<span lang="EN-US">GB2312</span>又称国标码，</span>
				<span style="FONT-FAMILY: 宋体">由国家标准总局发布，</span>
				<span lang="EN-US">1981</span>
				<span style="FONT-FAMILY: 宋体">年</span>
				<span lang="EN-US">5</span>
				<span style="FONT-FAMILY: 宋体">月</span>
				<span lang="EN-US">1</span>
				<span style="FONT-FAMILY: 宋体">日实施，通行于大陆。新加坡等地也使用此编码。它是一个简化字的编码规范，当然也包括其他的符号、字母、日文假名等，共</span>
				<span lang="EN-US">7445</span>
				<span style="FONT-FAMILY: 宋体">个图形字符，其中汉字占</span>
				<span lang="EN-US">6763</span>
				<span style="FONT-FAMILY: 宋体">个。我们平时说</span>
				<span lang="EN-US">6768</span>
				<span style="FONT-FAMILY: 宋体">个汉字，实际上里边有</span>
				<span lang="EN-US">5</span>
				<span style="FONT-FAMILY: 宋体">个编码为空白，所以总共有</span>
				<span lang="EN-US">6763</span>
				<span style="FONT-FAMILY: 宋体">个汉字。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">      GB2312</span>
				<span style="FONT-FAMILY: 宋体">规定“对任意一个图形字符都采用两个字节表示，每个字节均采用七位编码表示”，习惯上称第一个字节为“高字节”，第二个字节为“低字节”。</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">GB2312</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">中汉字的编码范围为，第一字节<span lang="EN-US">0xB0-0xF7(</span>对应十进制为<span lang="EN-US">176-247)</span>，第二个字节<span lang="EN-US">0xA0-0xFE</span>（对应十进制为<span lang="EN-US">160-254</span>）。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">    </span>
				<span lang="EN-US">GB2312</span>
				<span style="FONT-FAMILY: 宋体">将代码表分为</span>
				<span lang="EN-US">94</span>
				<span style="FONT-FAMILY: 宋体">个区，对应第一字节（</span>
				<span lang="EN-US" style="FONT-FAMILY: 宋体">0xa1-0xfe</span>
				<span style="FONT-FAMILY: 宋体">）；每个区</span>
				<span lang="EN-US">94</span>
				<span style="FONT-FAMILY: 宋体">个位（</span>
				<span lang="EN-US" style="FONT-FAMILY: 宋体">0xa1-0xfe</span>
				<span style="FONT-FAMILY: 宋体">），对应第二字节，两个字节的值分别为区号值和位号值加</span>
				<span lang="EN-US">32</span>
				<span style="FONT-FAMILY: 宋体">（</span>
				<span lang="EN-US">2OH</span>
				<span style="FONT-FAMILY: 宋体">），因此也称为区位码。</span>
				<span lang="EN-US">01-09</span>
				<span style="FONT-FAMILY: 宋体">区为符号、数字区，</span>
				<span lang="EN-US">16-87</span>
				<span style="FONT-FAMILY: 宋体">区为汉字区（</span>
				<span lang="EN-US" style="FONT-FAMILY: 宋体">0xb0-0xf7</span>
				<span style="FONT-FAMILY: 宋体">），</span>
				<span lang="EN-US">10-15</span>
				<span style="FONT-FAMILY: 宋体">区、</span>
				<span lang="EN-US">88-94</span>
				<span style="FONT-FAMILY: 宋体">区是有待进一步标准化的空白区。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
				</span> </p>
		<p class="MsoNormal">
				<span lang="EN-US">       2</span>
				<span style="FONT-FAMILY: 宋体">、</span>
				<span lang="EN-US">Big5</span>
				<span style="FONT-FAMILY: 宋体">又称大五码，主要为香港与台湾使用，即是一个繁体字编码。</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">每个汉字由两个字节构成，第一个字节的范围从</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">0X81</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">－</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">0XFE</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">（即</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">129-255</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">），共</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">126</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">种。第二个字节的范围不连续，分别为</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">0X40</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">－</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">0X7E</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">（即</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">64-126</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">），</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">0XA1</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">－</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">0XFE</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">（即</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">161-254</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">），共</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Arial">157</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">种。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">
				</span> </p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">    3</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">、<span lang="EN-US">GBK</span>是<span lang="EN-US">GB2312</span>的扩展，是向上兼容的，因此<span lang="EN-US">GB2312</span>中的汉字的编码与<span lang="EN-US">GBK</span>中汉字的相同。另外，<span lang="EN-US">GBK</span>中还包含繁体字的编码，它与<span lang="EN-US">Big5</span>编码之间的关系我还没有弄明白，好像是不一致的。<span lang="EN-US">GBK</span>中每个汉字仍然包含两个字节，第一个字节的范围是<span lang="EN-US">0x81-0xFE</span>（即<span lang="EN-US">129-254</span>），第二个字节的范围是<span lang="EN-US">0x40-0xFE</span>（即<span lang="EN-US">64-254</span>）。<span lang="EN-US">GBK</span>中有码位<span lang="EN-US">23940</span>个，包含汉字<span lang="EN-US">21003</span>个。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">                                     </span>
		</p>
		<p class="MsoNormal">
				<span lang="en-us" style="FONT-FAMILY: 宋体">                                   </span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">表<span lang="EN-US">1 </span>汉字编码范围</span>
		</p>
		<table class="MsoTableGrid" id="table1" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN-LEFT: 50.4pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1">
				<tbody>
						<tr>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 81pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="108">
										<p class="MsoNormal">
												<span style="COLOR: black; FONT-FAMILY: 宋体">名称</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="192">
										<p class="MsoNormal">
												<span style="COLOR: black; FONT-FAMILY: 宋体">第一字节</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 153pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="204">
										<p class="MsoNormal">
												<span style="COLOR: black; FONT-FAMILY: 宋体">第二字节</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 81pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="108">
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">GB2312</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="192">
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">0xB0-0xF7(176-247) </span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 153pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="204">
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">0xA0-0xFE</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">（</span>
												<span lang="EN-US" style="COLOR: black">160-254</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">）</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 81pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="108">
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">GBK</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="192">
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">0x81-0xFE</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">（</span>
												<span lang="EN-US" style="COLOR: black">129-254</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">）</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 153pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="204">
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">0x40-0xFE</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">（</span>
												<span lang="EN-US" style="COLOR: black">64-254</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">）</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 81pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="108">
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">Big5</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="192">
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">0x81-0xFE</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">（</span>
												<span lang="EN-US" style="COLOR: black">129-255</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">）</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 153pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="204">
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">0x40-0x7E</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">（</span>
												<span lang="EN-US" style="COLOR: black">64-126</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">）</span>
										</p>
										<p class="MsoNormal">
												<span lang="EN-US" style="COLOR: black">0xA1</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">－</span>
												<span lang="EN-US" style="COLOR: black">0xFE</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">（</span>
												<span lang="EN-US" style="COLOR: black">161-254</span>
												<span style="COLOR: black; FONT-FAMILY: 宋体">）</span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">
				</span> </p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">
				</span> </p>
		<p class="MsoNormal">
				<span style="COLOR: black; FONT-FAMILY: 宋体">二、对汉字进行<span lang="EN-US">hash</span></span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">    </span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">为了处理汉字的方便，在查找汉字的时候，我们通常会用到<span lang="EN-US">hash</span>的方法，那怎么来确定一个汉字位置呢？这就和每种编码的排列有关了，这里主要给出一种<span lang="EN-US">hash</span>函数的策略。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">    </span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">对于<span lang="EN-US">GB2312</span>编码，设输入的汉字为<span lang="EN-US">GBword</span>，我们可以采用公式<span lang="EN-US">(C1-176)*94 + (C2-161)</span>确定<span lang="EN-US">GBindex</span>。其中，<span lang="EN-US">C1</span>表示第一字节，<span lang="EN-US">C2</span>表示第二字节。具体如下：</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="COLOR: #3700c8; FONT-FAMILY: Fixedsys">    GBindex = ((unsigned char)GBword.at(0)-176)*94 + (unsigned char)GBword.at(1) - 161;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">    </span>
				<span style="FONT-FAMILY: 宋体">之所以用<span lang="EN-US">unsigned char</span>类型，是因为<span lang="EN-US">char</span>是一个字节，如果用<span lang="EN-US">unsigend int</span>，因为<span lang="EN-US">int</span>是<span lang="EN-US">4</span>个字节的，所以会造成扩展，导致错误。</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 18.05pt; TEXT-INDENT: -35.9pt; TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">       </span>
				<span style="FONT-FAMILY: 宋体">对于<span lang="EN-US">GBK</span>编码，设输入的汉字为<span lang="EN-US">GBKword</span>，则可以采用公式<span lang="EN-US">   </span></span>
				<span lang="EN-US" style="FONT-FAMILY: 宋体">index=(ch1-0x81)*190+(ch2-0x40)-(ch2/128)</span>
				<span style="FONT-FAMILY: 宋体">，其中<span lang="EN-US">ch1</span>是第一字节，<span lang="EN-US">ch2</span>是第二字节。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">    </span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">具体的，</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3700c8; FONT-FAMILY: Fixedsys">    GBKindex = ((unsigned char)GBKword[0]-129)*190 +</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3700c8; FONT-FAMILY: Fixedsys">               ((unsigned char)GBKword[1]-64) - (unsigned char)GBKword[1]/128;</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">
				</span> </p>
		<p class="MsoNormal">
				<span style="COLOR: black; FONT-FAMILY: 宋体">三、怎样判断一个汉字的是什么编码</span>
		</p>
		<p class="MsoNormal">
				<span style="COLOR: black; FONT-FAMILY: 宋体">直接根据汉字的编码范围判断，对于<span lang="EN-US">GB2312</span>和<span lang="EN-US">GBK</span>可用下面两个程序实现。</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">1</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">、判断是否是<span lang="EN-US">GB2312</span></span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">bool isGBCode(const string&amp; strIn)</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">{</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">    unsigned char ch1;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">    unsigned char ch2;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">    </span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">    if (strIn.size() &gt;= 2)</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">    {</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">        ch1 = (unsigned char)strIn.at(0);</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">        ch2 = (unsigned char)strIn.at(1);</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">        if (ch1&gt;=176 &amp;&amp; ch1&lt;=247 &amp;&amp; ch2&gt;=160 &amp;&amp; ch2&lt;=254)</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">            return true;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">        else return false;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">    }</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">    else return false;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">}</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">2</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">、判断是否是<span lang="EN-US">GBK</span>编码</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">bool isGBKCode(const string&amp; strIn)</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">{</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">    unsigned char ch1;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">    unsigned char ch2;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">    </span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">    </span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">if (strIn.size() &gt;= 2)</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">    {</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">        </span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">ch1 = (unsigned char)strIn.at(0);</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">        ch2 = (unsigned char)strIn.at(1);</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">        if (ch1&gt;=129 &amp;&amp; ch1&lt;=254 &amp;&amp; ch2&gt;=64 &amp;&amp; ch2&lt;=254)</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">            return true;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">        else return false;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">    }</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">    else return false;</span>
		</p>
		<p class="MsoNormal" style="TEXT-ALIGN: left" align="left">
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">}</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">
				</span> </p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">3</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">、对于<span lang="EN-US">Big5</span></span>
		</p>
		<p class="MsoPlainText">
				<span lang="EN-US">    </span>它的范围为：高字节从<span lang="EN-US">0xA0</span>到<span lang="EN-US">0xFE</span>，低字节从<span lang="EN-US">0x40</span>到<span lang="EN-US">0x7E</span>，和<span lang="EN-US">0xA1</span>到<span lang="EN-US">0xFE</span>两部分。判断一个汉字是否是<span lang="EN-US">BIG5</span>编码，可以如上对字符的编码范围判断即可。如何定位呢？那么也想象所有编码排列为一个二维坐标，纵坐标是高字节，横坐标是低字节。这样一行上的汉字个数：<span lang="EN-US">(0x7E-0x40+1)+(0xFE-0xA1+1)</span>＝<span lang="EN-US">157</span>。那么定位算法分两块，为<span lang="EN-US">:  </span></p>
		<p class="MsoPlainText">
				<span lang="EN-US">    if 0x40&lt;=ch2&lt;=0x7E: #is big5 char </span>
		</p>
		<p class="MsoPlainText">    <span lang="PT-BR">index=((ch1-0xA1)*157+(ch2-0x40))*2 </span></p>
		<p class="MsoPlainText">
				<span lang="EN-US">    elif 0xA1&lt;=ch2&lt;=0xFE: #is big5 char </span>
		</p>
		<p class="MsoPlainText">    <span lang="PT-BR">index=((ch1-0xA1)*157+(ch2-0xA1+63))*2 </span></p>
		<p class="MsoPlainText">
				<span lang="PT-BR">
				</span> </p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">对于第二块，计算偏移量时因为有两块数值，所以在计算后面一段值时，不要忘了前面还有一段值。<span lang="EN-US">0x7E-0x40+1=63</span>。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">
				</span> </p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">四、如果判断一个字符是西文字符还是中文字符</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">    </span>
				<span style="FONT-FAMILY: 宋体">大家知道西文字符主要是指</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">ASCII</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">码，它用一个字节表示。且这个字符转换成数字之后，该数字是大于<span lang="EN-US">0</span>的，而汉字是两个字节的，第一个字节的转化为数字之后应该是小于<span lang="EN-US">0</span>的，因此可以根据每个字节转化为数字之后是否小于<span lang="EN-US">0</span>，判断它是否是汉字。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">    </span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">例如，设输入字为<span lang="EN-US">strin</span>，则，</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">     If (strin.at(0) &lt; 0)</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">       cout &lt;&lt; ”</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">是汉字<span lang="EN-US">” &lt;&lt; endl;</span></span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">     else cout &lt;&lt; ”</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">不是汉字<span lang="EN-US">” &lt;&lt; endl;</span></span>
		</p>
		<p class="MsoNormal">　汉字在 Unicode 里面有单独的几块区域，是中日韩（朝鲜）共享的。<br />以下两段<br />U+4e00 ~ U+9FB0 原来 GB2312 和 GBK 中的汉字<br />U+3400 ~ U+4DB6 包括 GB18030.2000 中那些增加的汉字</p>
		<p class="MsoNormal">
				<span lang="en-us" style="FONT-FAMILY: 宋体">五、编码表下载</span>
		</p>
		<p class="MsoNormal">
				<span lang="en-us" style="FONT-FAMILY: 宋体">   GBK编码表，<a href="http://users.ir-lab.org/~taozi/GBK1.txt">下载</a></span>
		</p>
		<p class="MsoNormal">
				<span lang="en-us" style="FONT-FAMILY: 宋体">   GB2312编码表，<a href="http://users.ir-lab.org/~taozi/Gb2312.TXT">下载</a></span>
		</p>
<img src ="http://www.blogjava.net/huamengxing/aggbug/234639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2008-10-16 10:03 <a href="http://www.blogjava.net/huamengxing/archive/2008/10/16/234639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 乱码的处理</title><link>http://www.blogjava.net/huamengxing/archive/2008/10/16/234635.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Thu, 16 Oct 2008 01:57:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2008/10/16/234635.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/234635.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2008/10/16/234635.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/234635.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/234635.html</trackback:ping><description><![CDATA[这一段出现了乱码，那么不妨用穷举法猜测一下它的实际编码格式。 <br />System.out.println(new String(testString.getBytes("ISO-8859-1"),"gb2312")); <br />System.out.println(new String(testString.getBytes("UTF8"),"gb2312")); <br />System.out.println(new String(testString.getBytes("GB2312"),"gb2312")); <br />System.out.println(new String(testString.getBytes("GBK"),"gb2312")); <br />System.out.println(new String(testString.getBytes("BIG5"),"gb2312")); <br /><img src ="http://www.blogjava.net/huamengxing/aggbug/234635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2008-10-16 09:57 <a href="http://www.blogjava.net/huamengxing/archive/2008/10/16/234635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LoadPolicyFile flash 跨域问题</title><link>http://www.blogjava.net/huamengxing/archive/2008/08/14/loadPolicyFile.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Thu, 14 Aug 2008 05:19:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2008/08/14/loadPolicyFile.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/221978.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2008/08/14/loadPolicyFile.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/221978.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/221978.html</trackback:ping><description><![CDATA[ Security.loadPolicyFile("xmlsocket://"+SERVER_NAME+":5229");   <br />目前来说这个跨域文件还只能加载一次这个是flashplayer的一个bug在flashplayer9中一直存在这个问题目前还没有解决掉。 <img src="http://2dgame.cn/images/2dgamefriend.gif" /> 具体详情参见 <a href="http://bugs.adobe.com/jira/browse/FP-67">http://bugs.adobe.com/jira/browse/FP-67</a><br /><img src ="http://www.blogjava.net/huamengxing/aggbug/221978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2008-08-14 13:19 <a href="http://www.blogjava.net/huamengxing/archive/2008/08/14/loadPolicyFile.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>response.getOutputStream()  在jsp页面 中抛出异常的的处理</title><link>http://www.blogjava.net/huamengxing/archive/2007/11/05/158264.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Mon, 05 Nov 2007 06:43:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/11/05/158264.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/158264.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/11/05/158264.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/158264.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/158264.html</trackback:ping><description><![CDATA[ <br />添加如下代码：<br />out.clear();<br />out = pageContext.pushBody();<img src ="http://www.blogjava.net/huamengxing/aggbug/158264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-11-05 14:43 <a href="http://www.blogjava.net/huamengxing/archive/2007/11/05/158264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件操作</title><link>http://www.blogjava.net/huamengxing/archive/2007/10/31/157233.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Wed, 31 Oct 2007 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/10/31/157233.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/157233.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/10/31/157233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/157233.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/157233.html</trackback:ping><description><![CDATA[public class ssss {<br />    <br />    /** Creates a new instance of ssss */<br />    public ssss() {<br />    }<br />    public static void main(String s[]) throws IOException{<br /> //       java.net.URL  m=new java.net.URL("<a href="http://www.baidu.com/index.html">http://www.baidu.com/index.html</a>");<br />   //     HttpURLConnection sst=(HttpURLConnection) m.openConnection();<br />//           DataInputStream in = new DataInputStream(connection.getInputStream());<br />  //          DataOutputStream out = new DataOutputStream(new FileOutputStream(fileName));<br />      DataInputStream  tttt= new   DataInputStream((InputStream)new FileInputStream("c://ffffff.java.bak"));<br />  //      DataInputStream tttt=new DataInputStream(sst.getInputStream());<br />        DataOutputStream out = new DataOutputStream(new FileOutputStream("D://ffffff.java.bak"));<br />        byte[] buffer = new byte[4096];<br />        int count=0;<br />        while ((count = tttt.read(buffer))&gt;0){<br />            out.write(buffer,0,count);<br />        }<br />        out.close();<br />        tttt.close();<br />    }<img src ="http://www.blogjava.net/huamengxing/aggbug/157233.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-10-31 16:32 <a href="http://www.blogjava.net/huamengxing/archive/2007/10/31/157233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不错的网站</title><link>http://www.blogjava.net/huamengxing/archive/2007/10/26/156190.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Fri, 26 Oct 2007 08:51:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/10/26/156190.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/156190.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/10/26/156190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/156190.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/156190.html</trackback:ping><description><![CDATA[
		<a href="http://www.java2s.com">http://www.java2s.com</a>
		<br />http//www.dxiaoshuo.com<br /><a href="http://www.mdianying.com">http://www.mdianying.com</a><img src ="http://www.blogjava.net/huamengxing/aggbug/156190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-10-26 16:51 <a href="http://www.blogjava.net/huamengxing/archive/2007/10/26/156190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java性能</title><link>http://www.blogjava.net/huamengxing/archive/2007/10/26/156164.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Fri, 26 Oct 2007 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/10/26/156164.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/156164.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/10/26/156164.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/156164.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/156164.html</trackback:ping><description><![CDATA[
		<p>1. 有"+"操作的字符串, 使用StringBuffer代替String; 
</p>
		<p>2. 生成对象时，分配合理的空间和大小,如StringBuffer,Vector的初始化大小; 
</p>
		<p>3. 优化循环体,避免在循环中生成同一个变量或调用同一个函数（参数变量也一样）; 
</p>
		<p>4. 尽量在使用时才创建该对象; 应该尽量重复使用一个对象，而不是声明新的同类对象; 
</p>
		<p>5. 尽量使用局部变量; 尽量使用静态变量，从而使他所有的实例都共享这个变量; 
</p>
		<p>6. 尽量减少方法的调用, 可事先判断, 同时用变量替换; 
</p>
		<p>7. 尽量使用Java系统API,如复制大量数据时，使用System.arraycopy(); 
</p>
		<p>8. 尽可能使用带有Buffer的类代替没有Buffer的类; 
</p>
		<p>9. 不用保存太多的信息在HttpSession中, 同时注意清除Session; 
</p>
		<p>10. 大型数据量处理或批处理数据记录,尽量使用直接访问数据库的方法，用SQL直接存取数据; 
</p>
		<p>11. 在生产环境下,禁止servlet和jsp的自动重载; 
</p>
		<p>12. 插入下述“显式”计时代码，对程序进行评测： 
</p>
		<p>long start = System.currentTimeMillis(); // 要计时的运算代码放在这儿,返回的时间以千分之一秒（1毫秒）为单位 long time = System.currentTimeMillis() - start; 
</p>
		<p>13. 常用运算时间单位: 运算 示例 标准时间本地赋值 i=n; 1.0 实例赋值 this.i=n; 1.2 int增值 i++; 1.5 byte增值 b++; 2.0 short增值 s++; 2.0 float增值 f++; 2.0 double增值 d++; 2.0 空循环 while(true) n++; 2.0 三元表达式 (x&lt;0) ?-x : x 2.2 算术调用 Math.abs(x); 2.5 数组赋值 a[0] = n; 2.7 long增值 l++; 3.5 方法调用 funct(); 5.9 throw或catch异常 try{ throw e; }或catch(e){} 320 同步方法调用 synchMehod(); 570 新建对象 new Object(); 980 新建数组 new int[10]; 3100</p>
<img src ="http://www.blogjava.net/huamengxing/aggbug/156164.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-10-26 15:27 <a href="http://www.blogjava.net/huamengxing/archive/2007/10/26/156164.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多线程编程——基础篇 （二）</title><link>http://www.blogjava.net/huamengxing/archive/2007/10/22/154917.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Mon, 22 Oct 2007 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/10/22/154917.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/154917.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/10/22/154917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/154917.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/154917.html</trackback:ping><description><![CDATA[
		<span class="h1b">多线程编程——基础篇 （二）</span>
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td height="64">时间：2006-08-16<br />作者：<a href="http://dev2dev.bea.com.cn/author/536.html">axman</a><br />浏览次数：
<script language="JavaScript" src="/beabbscount.jsp?d_id=163406" type="text/JavaScript"></script>
 3723 <br />本文关键字：<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=Java">Java</a>, <a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=多线程">多线程</a>, <a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=线程">线程</a>, <a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=线程对象">线程对象</a>, <a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=单线程">单线程</a>, <a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=go deep into java">go deep into java</a></td>
								<td>
										<table class="box_content" cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td>
																		<span class="h2b">文章工具</span>
																		<br />
																		<img height="10" alt="推荐给朋友" src="http://dev2dev.bea.com.cn/images/letter001.gif" width="19" align="absMiddle" /> <a href="javascript:sendmail()">推荐给朋友</a><br /><img height="18" alt="打印文章" src="http://dev2dev.bea.com.cn/images/print001.gif" width="19" align="absMiddle" /> <a href="javascript:window.print()">打印文章</a></td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<!-- 提取技术文章 -->
		<div class="beas">
				<img height="1" alt="" src="http://dev2dev.bea.com.cn/images/dot6B6B6B.gif" width="100%" />
		</div>
		<p>　　在进入java平台的线程对象之前，基于<a href="http://dev2dev.bea.com.cn/bbsdoc/20060808312.html" target="_blank">基础篇（一）</a>的一些问题，我先插入两个基本概念。</p>
		<h3>[线程的并发与并行]</h3>
		<p>　　在单CPU系统中，系统调度在某一时刻只能让一个线程运行，虽然这种调试机制有多种形式(大多数是时间片轮巡为主)，但无论如何，要通过不断切换需要运行的线程让其运行的方式就叫<strong>并发(concurrent)</strong>。而在多CPU系统中，可以让两个以上的线程同时运行，这种可以同时让两个以上线程同时运行的方式叫做<strong>并行(parallel)</strong>。</p>
		<p>　　在上面包括以后的所有论述中，请各位朋友谅解，我无法用最准确的词语来定义储如并发和并行这类术语，但我以我的经验能通俗地告诉大家它是怎么一回事，如果您看到我说的一些"标准"文档上说的不一样，只要意思一致，那您就不要挑刺了。</p>
		<h3>[JAVA线程对象]</h3>
		<p>　　现在我们来开始考察JAVA中线程对象。 </p>
		<p>　　在JAVA中，要开始一个线程，有两种方式。一是直接调用Thread实例的start()方法，二是<br />将Runable实例传给一个Thread实例然后调用它的start()方法。</p>
		<p>　　在前面已经说过，线程对象和线程是两个完全不同的概念。这里我们再次深入一下，生成一个线程的实例，并不代表启动了线程。而启动线程是说在某个线程对象上启动了该实例对应的线程，当该线程结束后，并不会就立即消失。</p>
		<p>　　对于从很多书籍上可以看到的基础知识我就不用多说了。既然是基础知识，我也着重于从普通文档上读不到的内容。所以本节我重点要说的是两种线程对象产生线程方式的区别。</p>
		<pre class="code">class MyThread extends Thread{
  public int x = 0;
  
  public void run(){
    
    for(int i=0;i&lt;100;i++){
      try{
        Thread.sleep(10);
      }catch(Exception e){}
      System.out.println(x++);
      
    }
  }
}
</pre>
		<p>　　如果我们生成MyThread的一个实例，然后调用它的start()方法，那么就产生了这个实例对应的线程：</p>
		<pre class="code">public class Test {
  public static void main(String[] args) throws Exception{
    MyThread mt = new MyThread();
    mt.start();
  }
}
</pre>
		<p>　　不用说，最终会打印出0到99，现在我们稍微玩一点花样：</p>
		<pre class="code">public class Test {
  public static void main(String[] args) throws Exception{
    MyThread mt = new MyThread();
    mt.start();
    System.out.println(101);
  }
}
</pre>
		<p>　　也不用说，在<a href="http://dev2dev.bea.com.cn/bbsdoc/20060808312.html" target="_blank">基础篇（一）</a>中我们知道由于单CPU的原因，一般会先打印101，然后打印0到99。不过我们可以控制线程让它按我们的意思来运行：</p>
		<pre class="code">public class Test {
  public static void main(String[] args) throws Exception{
    MyThread mt = new MyThread();
    mt.start();
    mt.join();
    System.out.println(101);
  }
}
</pre>
		<p>　　好了，我们终于看到，mt实例对应的线程(假如我有时说mt线程请你不要怪我，不过我尽量不这么说)。在运行完成后，主线程才打印101。因为我们让当前线程(这里是主线程)等待mt线程的运行结束。"在线程对象a上调用join()方法，就是让当前正在执行的线程等待线程对象a对应的线程运行完成后才继续运行。" 请大家一定要深刻理解并熟记这句话，而我这里引出这个知识点的目的是为了让你继续看下面的例子：</p>
		<pre class="code">public class Test {
  public static void main(String[] args) throws Exception{
    MyThread mt = new MyThread();
    mt.start();
    mt.join();
    Thread.sleep(3000);
    mt.start();
  }
}
</pre>
		<p>　　当线程对象mt运行完成后，我们让主线程休息一下，然后我们再次在这个线程对象上启动线程。结果我们看到：</p>
		<p>　　Exception in thread "main" java.lang.IllegalThreadStateException</p>
		<p>　　也就是这种线程对象一时运行一次完成后，它就再也不能运行第二次了。我们可以看一下它有具体实现:</p>
		<pre class="code">    public synchronized void start() {
        if (started)
            throw new IllegalThreadStateException();
        started = true;
        group.add(this);
        start0();
    }
</pre>
		<p>　　一个Thread的实例一旦调用start()方法，这个实例的started标记就标记为true，事实中不管这个线程后来有没有执行到底，只要调用了一次start()就再也没有机会运行了，这意味着：</p>
		<h3>[通过Thread实例的start()，一个Thread的实例只能产生一个线程]</h3>
		<p>　　那么如果要在一个实例上产生多个线程(也就是我们常说的线程池)，我们应该如何做呢？这就是Runnable接口给我们带来的伟大的功能。</p>
		<pre class="code">class R implements Runnable{
  private int x = 0;
  public void run(){

    for(int i=0;i&lt;100;i++){
      try{
        Thread.sleep(10);
      }catch(Exception e){}
      System.out.println(x++);

    }
  }
}
</pre>
		<p>　　<br />正如它的名字一样，Runnable的实例是可运行的，但它自己并不能直接运行，它需要被Thread对象来包装才行运行：</p>
		<pre class="code">public class Test {
  public static void main(String[] args) throws Exception{
    new Thread(new R()).start();
  }
}
</pre>
		<p>　　当然这个结果和mt.start()没有什么区别。但如果我们把一个Runnable实例给Thread对象多次包装，我们就可以看到它们实际是在同一实例上启动线程：</p>
		<pre class="code">public class Test {
  public static void main(String[] args) throws Exception{
    R r = new R();
    for(int i=0;i&lt;10;i++)
      new Thread(r).start();
  }
}
</pre>
		<p>　　x是实例对象，但结果是x被加到了999，说明这10个线程是在同一个r对象上运行的。请大家注意，因为这个例子是在单CPU上运行的，所以没有对多个线程同时操作共同的对象进行同步。这里是为了说明的方便而简化了同步，而真正的环境中你无法预知程序会在什么环境下运行，所以一定要考虑同步。</p>
		<p>　　到这里我们做一个完整的例子来说明线程产生的方式不同而生成的线程的区别：</p>
		<pre class="code">package debug;

import java.io.*;
import java.lang.Thread;


class MyThread extends Thread{
  public int x = 0;

  public void run(){
    System.out.println(++x);
  }
}

class R implements Runnable{
  private int x = 0;
  public void run(){
    System.out.println(++x);
  }
}

public class Test {
  public static void main(String[] args) throws Exception{
    
    for(int i=0;i&lt;10;i++){
      Thread t = new MyThread();
      t.start();
    }
    Thread.sleep(10000);//让上面的线程运行完成
    R r = new R();
    for(int i=0;i&lt;10;i++){
      Thread t = new Thread(r);
      t.start();
    }
  }
}
</pre>
		<p>　　上面10个线程对象产生的10个线程运行时打印了10次1。下面10个线程对象产生的10个线程运行时打印了1到10。我们把下面的10个线程称为<strong>同一实例(Runnable实例)的多个线程</strong>。</p>
		<p>　　下节我们将研究线程对象方法，还是那句话，一般文档中可以读到的内容我不会介绍太多<br />请大家自己了解。</p>
		<strong>转载自dev2dev网友axman的go deep into java专栏。</strong>
		<h3>个人自述</h3>
		<p>一个男人.<br />一个写程序的男人.<br />一个写程序并正在从程序中寻找快乐的男人.<br />一个写程序并正在从程序中寻找快乐并把快乐传递给大家的男人.</p>
		<p>一个书生.<br />一个寂寞的书生.<br />一个寂寞的梅香竹影下敲声写韵的书生.<br />一个寂寞的梅香竹影下敲声写韵晨钟暮鼓中逸气扬剑的书生.</p>
		<p>那个男人是位书生。没有人知道他的姓名，居无定所，行无定踪，亦耕变读，或渔或樵。<br />所以有人叫他樵夫(Axman)，有人叫他渔郎(fisher)。</p>
<img src ="http://www.blogjava.net/huamengxing/aggbug/154917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-10-22 11:25 <a href="http://www.blogjava.net/huamengxing/archive/2007/10/22/154917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多线程编程——基础篇 （一）</title><link>http://www.blogjava.net/huamengxing/archive/2007/10/22/154913.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Mon, 22 Oct 2007 03:17:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/10/22/154913.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/154913.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/10/22/154913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/154913.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/154913.html</trackback:ping><description><![CDATA[
		<span class="h1b">多线程编程——基础篇 （一）</span>
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td height="64">时间：2006-08-08<br />作者：<a href="http://dev2dev.bea.com.cn/author/536.html">axman</a><br />浏览次数：
<script language="JavaScript" src="/beabbscount.jsp?d_id=163400" type="text/JavaScript"></script>
 5279 <br />本文关键字：<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=Java">Java</a>, <a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=多线程">多线程</a>, <a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=线程">线程</a>, <a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=线程对象">线程对象</a>, <a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=单线程">单线程</a>, <a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=go deep into java">go deep into java</a></td>
								<td>
										<table class="box_content" cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td>
																		<span class="h2b">文章工具</span>
																		<br />
																		<img height="10" alt="推荐给朋友" src="http://dev2dev.bea.com.cn/images/letter001.gif" width="19" align="absMiddle" /> <a href="javascript:sendmail()">推荐给朋友</a><br /><img height="18" alt="打印文章" src="http://dev2dev.bea.com.cn/images/print001.gif" width="19" align="absMiddle" /> <a href="javascript:window.print()">打印文章</a></td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<!-- 提取技术文章 -->
		<div class="beas">
				<img height="1" alt="" src="http://dev2dev.bea.com.cn/images/dot6B6B6B.gif" width="100%" />
		</div>
		<p>　　<strong>[写在前面]</strong></p>
		<p>　　随着计算机技术的发展，编程模型也越来越复杂多样化。但多线程编程模型是目前计算机系统架构的最终模型。随着CPU主频的不断攀升，X86架构的硬件已经成为瓶，在这种架构的CPU主频最高为4G。事实上目前3.6G主频的CPU已经接近了顶峰。</p>
		<p>　　如果不能从根本上更新当前CPU的架构(在很长一段时间内还不太可能)，那么继续提高CPU性能的方法就是超线程CPU模式。那么，作业系统、应用程序要发挥CPU的最大性能，就是要改变到以多线程编程模型为主的并行处理系统和并发式应用程序。</p>
		<p>　　所以，掌握多线程编程模型，不仅是目前提高应用性能的手段，更是下一代编程模型的核心思想。多线程编程的目的，就是"最大限度地利用CPU资源"，当某一线程的处理不需要占用CPU而只和I/O,OEMBIOS等资源打交道时，让需要占用CPU资源的其它线程有机会获得CPU资源。从根本上说，这就是多线程编程的最终目的。</p>
		<p>　　<strong>[第一需要弄清的问题]</strong></p>
		<p>　　如同程序和进程的区别，要掌握多线程编程，第一要弄清的问题是：<strong>线程对象和线程的区别</strong>。</p>
		<p>　　线程对象是可以产生线程的对象。比如在java平台中Thread对象，Runnable对象。线程，是指正在执行的一个指点令序列。在java平台上是指从一个线程对象的start()开始，运行run方法体中的那一段相对独立的过程。</p>
		<p>　　鉴于作者的水平，无法用更确切的词汇来描述它们的定义。但这两个有本质区别的概念请初学者细细体会，随着介绍的深入和例程分析的增加，就会慢慢明白它们所代表的真实含义。</p>
		<p>　　天下难事必始于易，天下大事必始于细。</p>
		<p>　　让我们先从最简单的"单线程"来入手：(1)带引号说明只是相对而言的单线程，(2)基于java。</p>
		<pre class="code">    class BeginClass{
        public static void main(String[] args){
            for(int i=0;i&lt;100;i++)
                System.out.println("Hello,World!");
        }
    }
</pre>
		<p>　　如果我们成功编译了该java文件，然后在命令行上敲入：</p>
		<p>　　java BeginClass</p>
		<p>　　现在发生了什么呢？每一个java程序员，从他开始学习java的第一分钟里都会接触到这个问</p>
		<p>　　题，但是，你知道它到底发生发什么？</p>
		<p>　　JVM进程被启动，在同一个JVM进程中，有且只有一个进程，就是它自己。然后在这个JVM环境中，所有程序的运行都是以线程来运行。JVM最先会产生一个主线程，由它来运行指定程序的入口点。在这个程序中，就是主线程从main方法开始运行。当main方法结束后，主线程运行完成。JVM进程也随之退出。 </p>
		<p>　　我们看到的是一个主线程在运行main方法，这样的只有一个线程执行程序逻辑的流程我们称</p>
		<p>　　之为<strong>单线程</strong>。这是JVM提供给我们的单线程环境，事实上，JVM底层还至少有垃圾回收这样的后台线程以及其它非java线程，但这些线程对我们而言不可访问，我们只认为它是单线程的。</p>
		<p>　　主线程是JVM自己启动的，在这里它不是从线程对象产生的。在这个线程中，它运行了main方法这个指令序列。理解它，但它没有更多可以研究的内容。</p>
		<p>　　<strong>[接触多线程]</strong></p>
		<pre class="code">    class MyThread extends Thread{
        public void run(){
            System.out.println("Thread say:Hello,World!");
        }
    }

    public class MoreThreads{
        public static void main(String[] args){
            new MyThread();
            new MyThread().start();
            System.out.println("Main say:Hello,World");
        }
    }
</pre>
		<p>　　执行这个程序，main方法第一行产生了一个线程对象，但并没有线程启动。</p>
		<p>　　main方法第二行产生了一个线程对象，并启动了一个线程。</p>
		<p>　　main方法第三行，产生并启动一个线程后，主线程自己也继续执行其它语句。</p>
		<p>　　我们先不研究Thread对象的具体内容，稍微来回想一下上面的两个概念，<strong>线程对象</strong>和<strong>线程</strong>。在JAVA中，线程对象是JVM产生的一个普通的Object子类。而线程是CPU分配给这个对象的一个运行过程。我们说的这个线程在干什么，不是说一个线程对象在干什么，而是这个运行过程在干什么。如果一时想不明白，不要急，但你要记得它们不是一回事就行了。</p>
		<p>　　累了吧？为不么不继续了？</p>
		<p>　　基于这种风格来介绍多线程，并不是每个人都喜欢和接受的，如果你不喜欢，正好不浪费你的时间了，而如果你接受的话，那就看下一节吧。 </p>
		<p>　　<strong>转载自dev2dev网友axman的<a href="http://blog.csdn.net/axman/" target="_blank">go deep into java专栏</a>。</strong></p>
		<h3>个人自述</h3>
		<p>一个男人.<br />一个写程序的男人.<br />一个写程序并正在从程序中寻找快乐的男人.<br />一个写程序并正在从程序中寻找快乐并把快乐传递给大家的男人.</p>
		<p>一个书生.<br />一个寂寞的书生.<br />一个寂寞的梅香竹影下敲声写韵的书生.<br />一个寂寞的梅香竹影下敲声写韵晨钟暮鼓中逸气扬剑的书生.</p>
		<p>那个男人是位书生。没有人知道他的姓名，居无定所，行无定踪，亦耕变读，或渔或樵。<br />所以有人叫他樵夫(Axman)，有人叫他渔郎(fisher)。</p>
		<!--文章其他信息-->
		<div class="dot001">
				<img height="1" alt="" src="http://dev2dev.bea.com.cn/images/_.gif" width="100%" />
		</div>
<img src ="http://www.blogjava.net/huamengxing/aggbug/154913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-10-22 11:17 <a href="http://www.blogjava.net/huamengxing/archive/2007/10/22/154913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多线程设计要点</title><link>http://www.blogjava.net/huamengxing/archive/2007/10/22/154881.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Mon, 22 Oct 2007 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/10/22/154881.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/154881.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/10/22/154881.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/154881.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/154881.html</trackback:ping><description><![CDATA[
		<h3 align="center">多线程设计要点</h3>
		<p align="center">
				<a href="http://www.jdon.com/aboutme.htm">板桥里人</a> http://www.jdon.com 2002/01/10</p>
		<table cellspacing="5" cellpadding="0" width="1%" align="left" border="0">
				<tbody>
						<tr>
								<td>
										<div id="vgad300x250" style="MARGIN-TOP: 10px; MARGIN-LEFT: 5px"> </div>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<font size="4">
						<b>1</b>
				</font>
				<b>.</b>多线程中有主内存和工作内存之分， 在JVM中，有一个主内存，专门负责所有线程共享数据；而每个线程都有他自己私有的工作内存， 主内存和工作内存分贝在JVM的stack区和heap区。</p>
		<p>
				<b>
						<font size="4">2.</font>
				</b>线程的状态有'Ready', 'Running', 'Sleeping', 'Blocked', 和 'Waiting'几个状态，<br />'Ready' 表示线程正在等待CPU分配允许运行的时间。</p>
		<p>
		</p>
		<p>
				<font size="4">
						<b>3.</b>
				</font>线程运行次序并不是按照我们创建他们时的顺序来运行的，CPU处理线程的顺序是不确定的，如果需要确定，那么必须手工介入，使用setPriority()方法设置优先级。</p>
		<p>
				<b>
						<font size="4">4.</font>
				</b>我们无从知道一个线程什么时候运行，两个或多个线程在访问同一个资源时，需要synchronized</p>
		<p>
				<b>
						<font size="4">5.</font>
				</b> 每个线程会注册自己，实际某处存在着对它的引用，因此，垃圾回收机制对它就“束手无策”了。</p>
		<p>
				<b>
						<font size="4">6.</font>
				</b> Daemon线程区别一般线程之处是：主程序一旦结束，Daemon线程就会结束。</p>
		<p>
				<b>
						<font size="4">7.</font>
				</b> 一个对象中的所有synchronized方法都共享一把锁，这把锁能够防止多个方法对通用内存同时进行的写操作。synchronized static方法可在一个类范围内被相互间锁定起来。</p>
		<p>
				<b>
						<font size="4">8.</font>
				</b> 对于访问某个关键共享资源的所有方法，都必须把它们设为synchronized，否则就不能正常工作。</p>
		<p>
				<font size="4">
						<b>9.</b>
				</font> 假设已知一个方法不会造成冲突，最明智的方法是不要使用synchronized，能提高些性能。</p>
		<p>
				<b>
						<font size="4">10</font>
				</b>. 如果一个"同步"方法修改了一个变量，而我们的方法要用到这个变量(可能是只读),最好将自己的这个方法也设为 synchronized。</p>
		<p>
				<b>
						<font size="4">11.</font>
				</b> synchronized不能继承，　父类的方法是synchronized，那么其子类重载方法中就不会继承“同步”。</p>
		<p>
				<b>
						<font size="4">12.</font>
				</b> 线程堵塞Blocked有几个原因造成：</p>
		<p>(1)线程在等候一些IO操作 <br />(2)线程试图调用另外一个对象的“同步”方法，但那个对象处于锁定状态，暂时无法使用。</p>
		<p>
				<b>
						<font size="4">13.</font>
				</b>原子型操作(atomic), 对原始型变量(primitive)的操作是原子型的atomic. 意味着这些操作是线程安全的， 但是大部分情况下，我们并不能正确使用，来看看 i = i + 1 , i是int型，属于原始型变量：<br /><br />(1)从主内存中读取i值到本地内存. <br />(2)将值从本地内存装载到线程工作拷贝中. <br />(3)装载变量1. <br />(4)将i 加 1. <br />(5)将结果给变量i. <br />(6)将i保存到线程本地工作拷贝中. <br />(7)写回主内存. </p>
		<p>注意原子型操作只限于第1步到第2步的读取以及第6到第7步的写, i的值还是可能被同时执行i=i+1的多线程中断打扰(在第4步)。</p>
		<p>double 和long 变量是非原子型的(non-atomic)。数组是object 非原子型。<br /></p>
		<p>
		</p>
		<p>
				<font size="4">
						<b>14.</b>
				</font> 由于13条的原因，我们解决办法是：</p>
		<p>class xxx extends Thread{</p>
		<p>//i会被经常修改<br />private int i;<br /><br />public synchronized int read(){ return i;}</p>
		<p>public synchronized void update(){ i = i + 1;}</p>
		<p>..........</p>
		<p>}</p>
		<p>
				<b>
						<font size="4">15.</font>
				</b> Volatile变量， volatile变量表示保证它必须是与主内存保持一致，它实际是"变量的同步", 也就是说对于volatile变量的操作是原子型的，如用在long 或 double变量前。<br /></p>
		<p>
				<b>
						<font size="4">16.</font>
				</b> 使用yield()会自动放弃CPU，有时比sleep更能提升性能。</p>
		<p>
				<b>
						<font size="4">17.</font>
				</b> sleep()和wait()的区别是：wait()方法被调用时会解除锁定，但是我们能使用它的地方只是在一个同步的方法或代码块内。</p>
		<p>
				<b>
						<font size="4">18.</font>
				</b> 通过制造缩小同步范围，尽可能的实现代码块同步，wait(毫秒数)可在指定的毫秒数可退出wait；对于wait()需要被notisfy()或notifyAll()踢醒。</p>
		<p>
				<b>
						<font size="4">19.</font>
				</b> 构造两个线程之间实时通信的方法分几步：<br />(1). 创建一个PipedWriter和一个PipedReader和它们之间的管道;<br />PipedReader in = new PipedReader(new PipedWriter())<br />(2). 在需要发送信息的线程开始之前，将外部的PipedWriter导向给其内部的Writer实例out<br />(3). 在需要接受信息的线程开始之前，将外部的PipedReader导向给其内部的Reader实例in<br />(4). 这样放入out的所有东西度可从in中提取出来。</p>
		<p>
				<b>
						<font size="4">20.</font>
				</b> synchronized带来的问题除性能有所下降外，最大的缺点是会带来死锁DeadLock，只有通过谨慎设计来防止死锁，其他毫无办法，这也是线程难以驯服的一个原因。不要再使用stop() suspend() resume()和destory()方法</p>
		<p>
				<b>
						<font size="4">21.</font>
				</b> 在大量线程被堵塞时，最高优先级的线程先运行。但是不表示低级别线程不会运行，运行概率小而已。</p>
		<p>
				<b>
						<font size="4">22.</font>
				</b> 线程组的主要优点是：使用单个命令可完成对整个线程组的操作。很少需要用到线程组。</p>
		<p>
				<b>
						<font size="4">23.</font>
				</b> 从以下几个方面提升多线程的性能：</p>
		<p>检查所有可能Block的地方，尽可能的多的使用sleep或yield()以及wait();</p>
		<p>尽可能延长sleep(毫秒数)的时间;</p>
		<p>运行的线程不用超过100个，不能太多；</p>
		<p>不同平台linux或windows以及不同JVM运行性能差别很大。</p>
		<p>
				<font size="4">
						<strong>24</strong>.</font> 推荐几篇相关英文文章:</p>
<img src ="http://www.blogjava.net/huamengxing/aggbug/154881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-10-22 10:21 <a href="http://www.blogjava.net/huamengxing/archive/2007/10/22/154881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>监听器的一个实现</title><link>http://www.blogjava.net/huamengxing/archive/2007/10/11/152041.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Thu, 11 Oct 2007 06:50:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/10/11/152041.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/152041.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/10/11/152041.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/152041.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/152041.html</trackback:ping><description><![CDATA[
		<p>public class PlatContextListener implements ServletContextListener{<br />    private Timer timer = null; <br />    /** 应用程序的根目录 */<br />    private static String contextPath = null;<br />    <br />    /** Creates a new instance of PlatContextListener */<br />    public PlatContextListener() {<br />    }</p>
		<p>    public void contextInitialized(ServletContextEvent sce) {<br />        ServletContext sc = sce.getServletContext();<br />        contextPath = sc.getRealPath("").replace("\\", "/");<br />        <br />        int nInterval=24*60*60*1000;<br />        <br />        timer = new Timer(true); <br />        <br />        //每天零晨3点执行清理工作<br />        Calendar calendar = Calendar.getInstance();<br />        calendar.set(Calendar.HOUR_OF_DAY,3);<br />        calendar.set(Calendar.MINUTE,0);<br />        calendar.set(Calendar.SECOND,0);<br />        Date time = calendar.getTime();<br />    <br />        timer.scheduleAtFixedRate(new PlatTimerClearTask(), time,nInterval); <br />        </p>
		<p>    }</p>
		<p>    public void contextDestroyed(ServletContextEvent sce) {<br />        timer.cancel();<br />    }<br />    <br />    public static String getContextPath() {<br />        return contextPath;<br />    }<br />    <br />}<br /></p>
<img src ="http://www.blogjava.net/huamengxing/aggbug/152041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-10-11 14:50 <a href="http://www.blogjava.net/huamengxing/archive/2007/10/11/152041.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数组只有length属性</title><link>http://www.blogjava.net/huamengxing/archive/2007/08/30/141478.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Thu, 30 Aug 2007 10:18:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2007/08/30/141478.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/141478.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2007/08/30/141478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/141478.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/141478.html</trackback:ping><description><![CDATA[数组只有length属性<br /><br />Locale.getAvailableLocales().length<img src ="http://www.blogjava.net/huamengxing/aggbug/141478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2007-08-30 18:18 <a href="http://www.blogjava.net/huamengxing/archive/2007/08/30/141478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>