<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>krf301的博客</title>
<link>http://blogger.org.cn/blog/blog.asp?name=krf301</link>
<description>krf301的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[java中如何正确使用字体编码-摘自计算机世界报]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24435</link>
<author>krf301</author>
<pubDate>2007/4/29 19:17:23</pubDate>
<description><![CDATA[<DIV class=date>&nbsp;</DIV>
<TABLE style="TABLE-LAYOUT: fixed">
<TBODY>
<TR>
<TD>
<DIV class=cnt>
<DIV>
<P>在Java编程中，中文字体编码难倒了不少程序员，如果抓住了影响Java中文显示的几个关键因素，问题将迎刃而解。 </P>
<P>Java是目前最流行的面向对象的编程语言之一，Java支持UTF-8、ISO-8859-1、GBK等各种字体编码，可笔者发现Java中字体编码的问题仍难倒了不少程序员，网上虽然也有不少关于在Java中如何正确显示中文的文章，但都不够全面，笔者特意总结如下。 </P>
<P>影响Java中字体编码正确显示的有几个因素: 1)数据库的连接方式; 2)网页中使用的字体编码; 3)数据库里存放数据的字体编码; 4)Java的缺省字体编码。如果在编程中遇到不能正确显示中文时，要先弄清楚以上几项所使用的字体编码，再分析找出原因，即可解决问题。 </P>
<P>众所周知，JSP是Java的一种，和网页有关，而网页也有自己的中文编码系统，所以JSP处理中文要比纯Java的类文件更为麻烦。本文的测试数据库是MySQL3.2，数据库连接驱动是用org.gjt.mm.mysql.Driver，这里主要讨论UTF-8和GBK的显示( GB2312是GBK的一个子集，Java中可以使用GBK来代替GB系列)。我们先来研究JSP中字体编码问题， 下面第一到第六点是针对JSP的(因为从数据库里读出中文数据与写入中文数据有所区别，咱们分别说明，前三点是从读取数据库到显示在网页，后三点是从网页输入数据到存入数据库)，第七到第九点针对纯Java的类文件。 以下rs表示ResultSet的一个实例，是执行Select语句之后产生的数据集。 </P>
<P>一、数据库连接方式使用UTF-8 </P>
<P>在连接数据库的驱动后面加上这句参数useUnicode=true&amp;characterEncoding= </P>
<P>UTF-8，例如jdbc:mysql://localhost/DBVF?autoReconnect=true&amp;useUnicode= </P>
<P>true&amp;characterEncoding=UTF-8，从数据库里读出中文显示在使用GBK的JSP的网页里，如果数据库里存放的字体编码是UTF-8，在JSP中使用 str=new String(rs.getBytes(1),"UTF-8")或者str=rs.getString(1)，可以正确显示中文。如果数据库里存放的是GBK数据，那么JSP中也要使用str=new String(rs.getBytes(1),"GBK")来显示正确的中文。值得注意的是如果页面使用UTF-8，数据库里存放的是UTF-8，也可以用str=new String(rs.getBytes(1),"GBK")正确显示中文。如果网页是UTF-8，而数据库里存放的是GBK，无法直接显示中文，需要2步转换, str=new String(rs.getBytes(1),"GBK"); 再str=new String(str.getBytes("UTF-8"),"GBK")，才可以正确显示中文。 </P>
<P>二、数据库连接方式使用GBK </P>
<P>在连接数据库的驱动后面加上这句参数useUnicode=true&amp;characterEncoding= </P>
<P>GBK,例如jdbc:mysql://localhost/DBVF?autoReconnect=true&amp;UseUnicode=true&amp; </P>
<P>characterEncoding=GBK，从数据库里读出中文，显示在使用GBK的JSP的网页里，如果数据库里存放的字体编码是UTF-8，在JSP中一定要使用 str=new String(rs.getBytes(1),"UTF-8")，才正确显示中文。如果数据库里存放的是GBK数据，那么JSP中也要使用str=new String(rs.getBytes(1),"GBK") 或者直接使用str=rs.getString(1)，即可显示正确的中文。 如果网页是UTF-8，而数据库里存放的是GBK，只能用str=new String(rs.getString(1).getBytes("UTF-8"),"GBK")的方法来显示中文; 如果网页是UTF-8，而数据库里存放的是UTF-8，可用str=new String(rs.getBytes(1),"GBK") 或者rs.getString(1)方法来显示中文。 </P>
<P>三、使用缺省数据库连接方式 </P>
<P>连接数据库的驱动后面没有这句参数useUnicode=&amp;characterEncoding=，例如jdbc:mysql://localhost/DBVF?autoReconnect=true，没有参数useUnicode=true&amp;characterEncoding，表示使用默认的ISO-8895-1编码。 </P>
<P>1. 从数据库里读出中文，显示在GBK的网页里。如果数据库里存放的字体编码是UTF-8，在JSP网页中一定要使用语句 str=new String(rs.getBytes(1),"UTF-8") 或者str= new String(rs.getString(1).getBytes("ISO-8859-1"),"UTF-8")，才可正确显示中文。如果数据库里存放的是GBK数据，那么JSP中也要使用str=new String(rs.getBytes(1),"GBK")或str=new String(rs.getString(1).getBytes("ISO-8859-1"),"GBK") 显示正确的中文。 </P>
<P>2. 如果网页是UTF-8,不能直接正确显示GBK，需要2步转换，str=new String(rs.getBytes(1),"GBK")，再str=new String(str.getBytes("UTF-8"),"GBK") 才可以正确显示中文。如果数据库里存的是UTF-8，直接用str=new String(rs.getBytes(1),"GBK")或者str=new String(rs.getString(1).getBytes("ISO-8859-1"),"GBK")就可以显示中文了。 </P>
<P>以上是读取数据库里中文正确显示在网页上，下面三点是如何正确存入数据库。 </P>
<P>四、数据库连接方式使用UTF-8编码 </P>
<P>JSP中要把网页输入的中文存入数据库，通常有一个提交(Submit)的过程，是用str=request.getParameter("username")，然后执行update或者insert语句来存入数据库。如何赋值给str很重要，而且这里中文输入与网页所使用的字体编码有关。 </P>
<P>1、 网页使用UTF-8，使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8")或者str= new String(request.getParameter("username").getBytes(),"UTF-8")，都可以使得存到数据库里的数据是UTF-8编码。 </P>
<P>2. 网页使用GBK，使用str= new String(request.getParameter("username").getBytes(),"GBK")，那么存入数据库的是UTF-8编码。 </P>
<P>3. 值得注意的是使用UTF-8的数据库连接方式不能存得GBK。 </P>
<P>五、数据库连接方式使用GBK编码 </P>
<P>1. 输入使用GBK网页，存到数据库里是GBK的方法: str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"GBK") 或者str= new String(request.getParameter("username").getBytes(),"GBK")。 </P>
<P>2. 网页使用GBK，想存入UTF-8到数据库里，要分2步: 先str=new String(request.getParameter("username").getBytes(),"GBK")，再str=new String(str.getBytes("UTF-8"),"GBK")即可。 </P>
<P>3. 网页使用UTF-8，而且使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"GBK") 或者str= new String(request.getParameter("username").getBytes(),"UTF-8")，那么存到数据库里的数据是UTF-8编码。 </P>
<P>4. 网页使用UTF-8，而且使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8")，那么存到数据库里的数据是GBK编码。 </P>
<P>六、数据库连接方式使用缺省，即不使用参数useUnicode和characterEncoding </P>
<P>1. 网页使用GBK，如果使用str= request.getParameter("username")或者str= new String(request.getParameter("username").getBytes())，那么在数据库里的数据是GBK码。网页使用UTF-8 和使用str= request.getParameter("username")，则存入数据库是UTF-8编码。 </P>
<P>2. 如果使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"))，那么根据网页提供的字体编码而存到数据库里，比如是UTF-8的网页，那么存到数据库中就是UTF-8编码，如果使用GBK网页，那么存到数据库里的字就是GBK编码。 </P>
<P>3. 如果使用str= new String(request.getParameter("username").getBytes("UTF-8"),"UTF-8")这一种组合能存到正确的数据外，其他存到数据库里的数据则都是乱码或者错误码。在这个UTF-8组合的特例中，网页使用的是GBK，则存放到数据库里就是GBK，网页使用UTF-8，那么存到数据库里的就是UTF-8。 </P>
<P>4. 网页是GBK的要存得UTF-8，一定需要2步: company=new String(request.getParameter("company").getBytes(),"GBK")和company=new String(company.getBytes("UTF-8"))。 </P>
<P>5. 网页是UTF-8的，不能存得GBK在数据库里，一句话，改变数据库连接方式不能存得GBK码。 </P>
<P>以上所有的都是基于JSP网页和数据库交换数据，下面讨论一下纯JAVA编程下的字体编码转换。 </P>
<P>七、数据库连接方式使用UTF-8编码 </P>
<P>1. 数据库里的中文是UTF-8，可以转换为GBK,但不能把GBK存入数据库。 </P>
<P>2. 数据库是GBK，如果转换为UTF-8，使用content=new String(rs.getBytes(2),"GBK")直接将content存入数据库就可为UTF-8。 </P>
<P>八、数据库连接方式使用GBK编码 </P>
<P>1. 数据库里的中文是UTF-8，如果转换为GBK，使用content= new String(rs.getString(2).getBytes(),"UTF-8"),再直接使用update或者insert语句插入到数据库，即存得GBK。如果使用content= new String(rs.getString(2).getBytes(),"GBK")或者content= new String(rs.getString(2).getBytes())，再存入数据库即存得还是UTF-8编码。 </P>
<P>2. 数据库里的中文是GBK，如果转换为UTF-8，使用content= new String(rs.getString(2).getBytes("UTF-8"))或者content= new String(rs.getString(2).getBytes("UTF-8"),"GBK")，再直接使用update或者insert语句插入到数据库,即存得UTF-8。 </P>
<P>3. 如果某个String是GBK，要转换为UTF-8，也是使用content= new String(GBKstr.getBytes("UTF-8"))或者content= new String(GBKstr.getBytes("UTF-8"),"GBK"); 如果某个String是UTF-8，要转换为GBK，应该使用new String(UTFstr.getBytes("GBK"),"UTF-8")。 </P>
<P>九、数据库连接方式使用缺省,即不跟参数 </P>
<P>1. str2=new String(GBKstr.getBytes("UTF-8"),"ISO-8859-1")，可以将数据库里的GBK编码转换为UTF-8。 </P>
<P>2. 读取UTF-8然后存入UTF-8，则用str1=new String(UTFstr.getBytes(),"ISO-8859-1")或者str1=new String(UTFstr.getBytes("GBK"),"ISO-8859-1")。 </P>
<P>3. 不能实现数据库里的UTF-8转换为GBK。 </P>
<P><FONT color=#5e0000>如果采用UTF-8的数据库连接方式或者缺省数据连接方式，那么无法将UTF-8转为GBK；而GBK的数据库连接方式可以实现UTF-8和GBK的相互转换。建议大家采用GBK的数据连接方式。</FONT></P></DIV></DIV></TD></TR></TBODY></TABLE>]]></description>
</item><item>
<title><![CDATA[jsp连接mysql乱码问题]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24342</link>
<author>krf301</author>
<pubDate>2007/4/25 19:52:37</pubDate>
<description><![CDATA[<DIV class=entry-body>
<P>解决方法一：</P>
<P>连接mysql时(无论在从mysql读还是取数据的情况)，指定使用的<A name=baidusnap3></A><B style="COLOR: black; BACKGROUND-COLOR: #ff9999">编码</B>方式为gb2312，具体代码如下</P>
<P></P>
<P>//装载mysql-jdbc驱动 <BR>Class.forName("com.mysql.jdbc.Driver").newInstance(); <BR>//连接<B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">数据库</B> <BR>Connection sqlCon = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test?user=root&amp;password=1&amp;useUnicode=true&amp;characterEncoding=gb2312" ); <BR></P>
<P>解决方法二：</P>
<P>如果方法一不行那么在方法一的基础上对读入的字符串进行强制<B style="COLOR: black; BACKGROUND-COLOR: #ff9999">编码</B>方式转换。</P>
<P>代码示例如下：</P>
<P>String name = rst.getString("name"); <BR>name= new String(name.getBytes("ISO-8859-1"),"gb2312"); </P>
<P>注：代码也可以为：String name =new String( rst.getString("name").getBytes("ISO-8859-1"),"gb2312"));其中rst为返回的resultset,ISO-8859-1为mysql默认的<B style="COLOR: black; BACKGROUND-COLOR: #ff9999">编码</B>方式，代码的目的是把以ISO-8859-1的<B style="COLOR: black; BACKGROUND-COLOR: #ff9999">编码</B>转换为gb2312<B style="COLOR: black; BACKGROUND-COLOR: #ff9999">编码</B>方式，这样强制转换，可以解决一部分问题，如果结合方法一，应该可以解决中文乱码问题。</P>
<P>之后问题解决</P></DIV>]]></description>
</item><item>
<title><![CDATA[乱码问题（二十）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24241</link>
<author>krf301</author>
<pubDate>2007/4/21 22:48:28</pubDate>
<description><![CDATA[我在《Java手机PDA程序设计入门》一书中看到在读取输入流的时候，为了解决正确读取字符串，建议把inputstream和inputstreamReader结合起来使用（我在本机上也的确遇到过这样的问题，读取的流里面如果含有UTF8的中文字符，用inputstream直接读，显示出来为乱码，但是用inputstreamReader创建为UTF8方式读就不会有问题）<BR>但是我在用这种方式读取163的返回时就有问题，具体代码如下：<BR>try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current=null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current=new WaitCanvas();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Display.getDisplay(MainMidlet.instance).setCurrent(current);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current.setMessage("正在连接。。。。。");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ConList.conmode==true){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int charpo=url.indexOf("/",7);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip=url.substring(0,charpo);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String suburl=url.substring(charpo);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url="http://10.0.0.172"+suburl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn=(HttpConnection)Connector.open(url,Connector.READ_WRITE,true);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;operation.FinishAlert("停止连接网络");//不连接网络时从这里抛出异常<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;suburl=null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn=(HttpConnection)Connector.open(url,Connector.READ_WRITE,true);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;operation.FinishAlert("停止连接网络");//不连接网络时从这里抛出异常<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.setRequestMethod(HttpConnection.POST);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ConList.conmode==true){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.setRequestProperty("X-Online-Host",ip);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.setRequestProperty("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.1");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.setRequestProperty("Content-Language","en-US");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.setRequestProperty("Content-Type","application/octet-stream");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.setRequestProperty("Accept","application/octet-stream");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.setRequestProperty("Connection","Keep-Alive");<BR>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;osStrm=conn.openOutputStream();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current.setMessage("连接成功。。。。。");<BR>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataOutputStream os=new DataOutputStream(osStrm);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current.setMessage("发送请求中。。。。。");<BR>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;requestcon.length;i++){<BR>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.writeUTF(requestcon[i]);<BR>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current.setMessage("发送请求完成。。。。。");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current.setMessage("接收信息中。。。。。");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int rc=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc=conn.getResponseCode();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;operation.FinishAlert("无法建立连接");//成功发出request后没有收到服务器的回馈信息<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(rc!=HttpConnection.HTTP_OK){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;operation.FinishAlert("服务器没有回应");//成功发出request后没有收到服务器的回馈信息<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; isStrm=conn.openInputStream();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; isr=new InputStreamReader(isStrm);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B>try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isr=new InputStreamReader(isStrm,"UTF8");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception e1){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isr=new InputStreamReader(isStrm,"UTF-8");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception e2){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isr=new InputStreamReader(isStrm,"utf8");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception e3){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isr=new InputStreamReader(isStrm,"utf-8");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int ic;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer b=new StringBuffer();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while ((ic = isr.read()) != -1) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.append((char)ic);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content=b.toString();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isr.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current.setMessage("接受完成。。。。。");<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(IOException e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;operation.FinishAlert("连接异常");//无法连接网络时从这里抛出异常<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}finally{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(conn!=null)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isStrm!=null)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isStrm.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;operation.FinishAlert("关闭错误");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Alert a=new Alert("提示信息");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.setString(content);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.setTimeout(Alert.FOREVER);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Display.getDisplay(MainMidlet.instance).setCurrent(a);<BR><BR>特别是中间黑体的部分，如果有这一段，读取163会提示连接异常，如果没有的话，就能读取的到信息下来，为什么在局域网中能用的方法到这些网页上就不能用了<BR><BR>而且对于检查conn.getResponseCode()是否为ok的状态，我感觉也是有时用了这个判断会连不上，如果不用的话直接读取反而还可以读取的信息，怎么会有这样的情况]]></description>
</item><item>
<title><![CDATA[数据库中取存数据]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24239</link>
<author>krf301</author>
<pubDate>2007/4/21 20:35:28</pubDate>
<description><![CDATA[
<TABLE cellSpacing=0 cellPadding=0 width="98%" align=center border=0>
<TBODY>
<TR>
<TD class=info>今天遇到一个乱码问题,不知是什么原因,我向数据库中插入一条记录后,再取出,若是中文,得到的就是乱码,请大伙帮帮忙...<BR>------------------<BR>package w113.conn;<BR><BR>import java.sql.*;<BR><BR>public class UseExecuteUpdate {<BR><BR>public static void main(String[] args) <BR>{<BR>String url = "jdbc:mysql://localhost/sql_test";<BR>String userName = "root";<BR>String passWord = "w113";<BR>String sql = null;<BR><BR>try<BR>{<BR>Class.forName("com.mysql.jdbc.Driver");<BR>}<BR>catch(Exception e)<BR>{<BR>e.printStackTrace();<BR>}<BR><BR>try<BR>{<BR>Connection conn = DriverManager.getConnection(url,userName,passWord);<BR>Statement stmt = conn.createStatement();<BR><BR>sql = "insert into student values('17','张三','hubei','2054-07-30')";<BR>int affectedRowCount = stmt.executeUpdate(sql);<BR>System.out.println("受插入操作影响的数据行数为:" + affectedRowCount);<BR><BR>sql = "select * from student where stu_id = '17'";<BR>ResultSet rs = stmt.executeQuery(sql);<BR>while(rs.next())<BR>{<BR>String id = rs.getString(1);<BR>String name = rs.getString(2);<BR>String address = rs.getString(3);<BR><BR>System.out.println(id + "" + name + "" +address);<BR>}<BR>}<BR>catch(Exception e)<BR>{<BR>e.printStackTrace();<BR>}<BR>}<BR>}<BR>---------------------<BR>我看到的结果:<BR><BR>受插入操作影响的数据行数为:1<BR>17??hubei<BR><BR></TD></TR>
<TR>
<TD height=10>&nbsp;</TD></TR>
<TR>
<TD class=reply2 height=5>&nbsp;</TD></TR>
<TR>
<TD height=5></TD></TR>
<TR>
<TD align=right height=20><FONT color=#cccccc>nationally(自由鸟)&nbsp;于&nbsp;2005-10-26 17:09:38</FONT></TD></TR>
<TR>
<TD class=reply2><BR>存储和取出的时候都<BR>用String.getByte("iso8859-1")转换<BR></TD></TR>
<TR>
<TD height=20></TD></TR>
<TR>
<TD height=5></TD></TR>
<TR>
<TD align=right height=20><FONT color=#cccccc>w1113(文)&nbsp;于&nbsp;2005-10-26 17:59:30</FONT></TD></TR>
<TR>
<TD class=reply2><BR>请大哥把存储和取出时的几行代码帮我实现一下，谢谢了..<BR></TD></TR>
<TR>
<TD height=20></TD></TR>
<TR>
<TD height=5></TD></TR>
<TR>
<TD align=right height=20><FONT color=#cccccc>lcwlyl(网络幽灵)&nbsp;于&nbsp;2005-10-26 18:25:58</FONT></TD></TR>
<TR>
<TD class=reply2><BR>应该是编码的问题，试试把取出来的中文转码。<BR></TD></TR>
<TR>
<TD height=20></TD></TR>
<TR>
<TD height=5></TD></TR>
<TR>
<TD align=right height=20><FONT color=#cccccc>overgame(我菜我存在)&nbsp;于&nbsp;2005-10-26 19:08:30</FONT></TD></TR>
<TR>
<TD class=reply2><BR>取代码的时候转换下就是<BR><BR>public String getString(String str){<BR>return new String(str, "GB2312"); <BR>}<BR></TD></TR>
<TR>
<TD height=20></TD></TR>
<TR>
<TD height=5></TD></TR>
<TR>
<TD align=right height=20><FONT color=#cccccc>pauliuyou(paul)&nbsp;于&nbsp;2005-10-27 10:59:03</FONT></TD></TR>
<TR>
<TD class=reply2><BR>存的时候用 s = new String(s.getBytes(),"ISO-8859-1");<BR>取的时候用 s = new String(s.getBytes("ISO-8859-1");<BR><BR></TD></TR>
<TR>
<TD height=20></TD></TR>
<TR>
<TD height=5></TD></TR>
<TR>
<TD align=right height=20><FONT color=#cccccc>w1113(文)&nbsp;于&nbsp;2005-10-27 17:06:01</FONT></TD></TR>
<TR>
<TD class=reply2><BR>还是乱码啊,<BR>大哥能不能帮我把代码写具体一些?<BR></TD></TR>
<TR>
<TD height=20></TD></TR>
<TR>
<TD height=5></TD></TR>
<TR>
<TD align=right height=20><FONT color=#cccccc>keiy&nbsp;于&nbsp;2005-10-27 17:13:43</FONT></TD></TR>
<TR>
<TD class=reply2><BR>试试我的:<BR>import java.sql.*;<BR><BR>public class mysqltest {<BR><BR>/**<BR>* @param args<BR>*/<BR>public static void main(String[] args) {<BR>// TODO Auto-generated method stub<BR>String url = "jdbc:mysql://192.168.0.222/";// 主机名和端口 <BR>String login = "test";// 登录名 <BR>String password = "test";// 密码 <BR><BR>try { <BR>Class.forName("com.mysql.jdbc.Driver");<BR>Connection connection = DriverManager.getConnection(url,login,password); <BR>//得到数据库驱动程序版本 <BR><BR>DatabaseMetaData conMD = connection.getMetaData(); <BR>System.out.println("Driver Name:\t" + conMD.getDriverName()); <BR>System.out.println("Driver Version:\t" + conMD.getDriverVersion()); <BR>//选择数据库 <BR>connection.setCatalog( "jtest"); <BR>//创建Statement <BR>Statement st = connection.createStatement();<BR>//插数据<BR>String sql2=new String("INSERT INTO test VALUES('测试',20)".getBytes("GBK"),"ISO8859_1"); <BR>st.executeUpdate(sql2); <BR>//执行查询 <BR>ResultSet rs = st.executeQuery("SELECT * FROM test"); <BR>//取得结果，输出到屏幕 <BR>String x;<BR>while (rs.next()){ <BR>for(int j=1; j&lt;=rs.getMetaData().getColumnCount(); j++){<BR>x=new String((rs.getString(j)).getBytes("ISO8859_1"),"GBK"); <BR>System.out.print( x+"\t"); <BR>} <BR><BR>System.out.println(); <BR>} <BR><BR>//关闭对象 <BR>st.close(); <BR>connection.close(); <BR>} catch(Exception e) { <BR>System.out.println("SQL Error:"+e.getMessage());<BR>} <BR><BR>}<BR>}<BR></TD></TR></TBODY></TABLE>]]></description>
</item><item>
<title><![CDATA[httpconnection]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24238</link>
<author>krf301</author>
<pubDate>2007/4/21 20:28:52</pubDate>
<description><![CDATA[
<DIV class=tit>httpconnection</DIV>
<DIV class=date>&nbsp;</DIV>
<TABLE style="TABLE-LAYOUT: fixed">
<TBODY>
<TR>
<TD>
<DIV class=cnt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; hc = (HttpConnection) Connector.open(url , Connector.READ/*_WRITE*/ , true ) ; <BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if( gateway != null ){<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; hc.setRequestProperty( "X-Online-Host", webServerAddress ) ;<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; hc.setRequestProperty("Content-Type" , <BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "application/xml, text/html, text/plain, " ) ; <BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(cookieSessionID!=null){<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; hc.setRequestProperty("Cookie", cookieSessionID);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 告知服务器当前客户端的版本号<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //hc.setRequestProperty("User-Agent", "1.0") ;&nbsp; 错误！<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; hc.setRequestProperty("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.1"); // CLDC-1.1<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; hc.setRequestProperty("Pragma", "no-cache");<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; hc.setRequestProperty("Cache-Control", "no-cache") ; <BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //hc.setRequestProperty("Connection", "close");<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; hc.setRequestProperty("User-Chat-Agent", <BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.getProperty("microedition.platform") );<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; hc.setRequestProperty("Accept-Charset" , "utf-8" ) ; <BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; hc.setRequestProperty("Accept-Language", "zh, en" ) ;</DIV></TD></TR></TBODY></TABLE>]]></description>
</item><item>
<title><![CDATA[乱码问题（十七）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24082</link>
<author>krf301</author>
<pubDate>2007/4/16 23:29:30</pubDate>
<description><![CDATA[一、JSP页面显示乱码二、表单提交中文时出现乱码三、数据库连 &nbsp; &nbsp; <BR>&nbsp; 大家在JSP的开发过程中，经常出现中文乱码的问题，可能一至困扰着您，我现在把我在JSP开发中遇到的中文乱码的问题及解决办法写出来供大家参考。 &nbsp; &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; 一、JSP页面显示乱码 &nbsp; &nbsp; <BR>&nbsp; 下面的显示页面(display.jsp)就出现乱码： &nbsp; &nbsp; <BR>&nbsp; &lt;html&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;head&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;title&gt;JSP的中文处理&lt;/title&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;meta &nbsp; http-equiv="Content-Type" &nbsp; content="text/html; &nbsp; charset=gb2312"&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;/head&gt; &nbsp; &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; &lt;body&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;% &nbsp; &nbsp; <BR>&nbsp; out.print("JSP的中文处理"); &nbsp; &nbsp; <BR>&nbsp; %&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;/body&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;/html&gt; &nbsp; &nbsp; <BR>&nbsp; 对不同的WEB服务器和不同的JDK版本，处理结果就不一样。原因：服务器使用的编码方式不同和浏览器对不同的字符显示结果不同而导致的。解决办法：在JSP页面中指定编码方式(gb2312),即在页面的第一行加上：&lt;%@ &nbsp; page &nbsp; contentType="text/html; &nbsp; charset=gb2312"%&gt;，就可以消除乱码了。完整页面如下： &nbsp; &nbsp; <BR>&nbsp; &lt;%@ &nbsp; page &nbsp; contentType="text/html; &nbsp; charset=gb2312"%&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;html&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;head&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;title&gt;JSP的中文处理&lt;/title&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;meta &nbsp; http-equiv="Content-Type" &nbsp; content="text/html; &nbsp; charset=gb2312"&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;/head&gt; &nbsp; &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; &lt;body&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;% &nbsp; &nbsp; <BR>&nbsp; out.print("JSP的中文处理"); &nbsp; &nbsp; <BR>&nbsp; %&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;/body&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;/html&gt; &nbsp; &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; 二、表单提交中文时出现乱码 &nbsp; &nbsp; <BR>&nbsp; 下面是一个提交页面(submit.jsp)，代码如下： &nbsp; &nbsp; <BR>&nbsp; &lt;html&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;head&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;title&gt;JSP的中文处理&lt;/title&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;meta &nbsp; http-equiv="Content-Type" &nbsp; content="text/html; &nbsp; charset=gb2312"&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;/head&gt; &nbsp; &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; &lt;body&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;form &nbsp; name="form1" &nbsp; method="post" &nbsp; action="process.jsp"&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;div &nbsp; align="center"&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;input &nbsp; type="text" &nbsp; name="name"&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;input &nbsp; type="submit" &nbsp; name="Submit" &nbsp; value="Submit"&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;/div&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;/form&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;/body&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;/html&gt; &nbsp; &nbsp; <BR>&nbsp; 下面是处理页面(process.jsp)代码： &nbsp; &nbsp; <BR>&nbsp; &lt;%@ &nbsp; page &nbsp; contentType="text/html; &nbsp; charset=gb2312"%&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;html&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;head&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;title&gt;JSP的中文处理&lt;/title&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;meta &nbsp; http-equiv="Content-Type" &nbsp; content="text/html; &nbsp; charset=gb2312"&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;/head&gt; &nbsp; &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; &lt;body&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;%=request.getParameter("name")%&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;/body&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;/html&gt; &nbsp; &nbsp; <BR>&nbsp; 如果submit.jsp提交英文字符能正确显示，如果提交中文时就会出现乱码。原因：浏览器默认使用UTF-8编码方式来发送请求，而UTF-8和GB2312编码方式表示字符时不一样，这样就出现了不能识别字符。解决办法:通过request.setCharacterEncoding("gb2312")对请求进行统一编码，就实现了中文的正常显示。修改后的process.jsp代码如下： &nbsp; &nbsp; <BR>&nbsp; &lt;%@ &nbsp; page &nbsp; contentType="text/html; &nbsp; charset=gb2312"%&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;% &nbsp; &nbsp; <BR>&nbsp; request.seCharacterEncoding("gb2312"); &nbsp; &nbsp; <BR>&nbsp; %&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;html&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;head&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;title&gt;JSP的中文处理&lt;/title&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;meta &nbsp; http-equiv="Content-Type" &nbsp; content="text/html; &nbsp; charset=gb2312"&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;/head&gt; &nbsp; &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; &lt;body&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;%=request.getParameter("name")%&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;/body&gt; &nbsp; &nbsp; <BR>&nbsp; &lt;/html&gt; &nbsp; &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; 三、数据库连接出现乱码 &nbsp; &nbsp; <BR>&nbsp; 只要涉及中文的地方全部是乱码，解决办法：在数据库的数据库URL中加上useUnicode=true&amp;characterEncoding=GBK就OK了。 &nbsp; &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; 四、数据库的显示乱码 &nbsp; &nbsp; <BR>&nbsp; 在mysql4.1.0中,varchar类型，text类型就会出现中文乱码，对于varchar类型把它设为binary属性就可以解决中文问题，对于text类型就要用一个编码转换类来处理，实现如下： &nbsp; &nbsp; <BR>&nbsp; public &nbsp; class &nbsp; Convert &nbsp; { &nbsp; &nbsp; <BR>&nbsp; /** &nbsp; 把ISO-8859-1码转换成GB2312 &nbsp; &nbsp; <BR>&nbsp; */ &nbsp; &nbsp; <BR>&nbsp; public &nbsp; static &nbsp; String &nbsp; ISOtoGB(String &nbsp; iso){ &nbsp; &nbsp; <BR>&nbsp; String &nbsp; gb; &nbsp; &nbsp; <BR>&nbsp; try{ &nbsp; &nbsp; <BR>&nbsp; if(iso.equals("") &nbsp; || &nbsp; iso &nbsp; == &nbsp; null){ &nbsp; &nbsp; <BR>&nbsp; return &nbsp; ""; &nbsp; &nbsp; <BR>&nbsp; } &nbsp; &nbsp; <BR>&nbsp; else{ &nbsp; &nbsp; <BR>&nbsp; iso &nbsp; = &nbsp; iso.trim(); &nbsp; &nbsp; <BR>&nbsp; gb &nbsp; = &nbsp; new &nbsp; String(iso.getBytes("ISO-8859-1"),"GB2312"); &nbsp; &nbsp; <BR>&nbsp; return &nbsp; gb; &nbsp; &nbsp; <BR>&nbsp; } &nbsp; &nbsp; <BR>&nbsp; } &nbsp; &nbsp; <BR>&nbsp; catch(Exception &nbsp; e){ &nbsp; &nbsp; <BR>&nbsp; System.err.print("编码转换错误："+e.getMessage()); &nbsp; &nbsp; <BR>&nbsp; return &nbsp; ""; &nbsp; &nbsp; <BR>&nbsp; } &nbsp; &nbsp; <BR>&nbsp; } &nbsp; &nbsp; <BR>&nbsp; } &nbsp; &nbsp; <BR>&nbsp; 把它编译成class，就可以调用Convert类的静态方法ISOtoGB()来转换编码。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;]]></description>
</item><item>
<title><![CDATA[乱码问题（十六）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24080</link>
<author>krf301</author>
<pubDate>2007/4/16 22:48:10</pubDate>
<description><![CDATA[
<H2 class=diaryTitle>jsp中的乱码问题&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </H2>
<P>
<P>关键问题：编码，建议统一为GB2312或GBK，本文使用GB2312，GBK未测试；</P>
<P><STRONG>【Step1】： 消除纯HTML页和JSP页在Tomcat环境下运行的乱码</STRONG></P>
<P>&nbsp;&nbsp; 这个是由于流览器无法选择编码方式造成的， 手动从IE中选择“GB2312”即可解决；也可以网页中加入META标记或Page指令；<BR>&nbsp;&nbsp; META标记如下：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp; Page指令如下：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--page language="java" contentType="text/html; ch***t=GB2312" pageEncoding="GB2312--><BR>&nbsp;&nbsp; 前面说明中已经提到， META在2K下可能不起作用（XP下时了时坏），因为简单起见，加入Page指令似乎是一个一劳永逸的事情；</P>
<P>&nbsp;&nbsp; 总结： 加入Page指令，一定可以使纯JSP页面或HTML页面在Tomcat环境下正常显示。</P>
<P><BR><STRONG>【Step2】： 消除从MySQL数据库中读出中文的乱码</STRONG></P>
<P>&nbsp;&nbsp;&nbsp; 分为两个目标： step1: 从MySQL客户端查看中文正常， step2: 从网页中查看中文正常；</P>
<P>&nbsp; 1: 在用SQL脚本创建数据库前，设置MySQL的默认编码方式为“gb2312”，<BR>&nbsp;&nbsp; 此步可以在mysql-administrator-1.1.0-rc-win.msi中完成，或者是MySQL Server向导；<BR>&nbsp;&nbsp;&nbsp;这样设置完毕后再用SQL 脚本创建数据库， 注意如果SQL脚本中有设置字符集为latin1或utf-8的语句，一定要删除。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 已发现目前版本《在线书店》中的SQL脚本中带有设置默认字符集为latin1，一定要删除！</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建数据库完毕后，用MySQL CC或MySQL Admin可检查所创建的数据库的字符集，如果正确，则用MySQL CC或MySQL Admin都可以正常查看中文；</P>
<P>&nbsp; 2:&nbsp; 一般情况下，到这一步，在网页中已经基本能正常显示中文了，但凡事总有例外，可以在数据库连接串处再特别说明一下：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String url ="jdbc:mysql://localhost/BookStore?useUnicode=true&amp;characterEncoding=gb2312";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn=DriverManager.getConnection(url,"root","");<BR></P>
<P>&nbsp;&nbsp; 一般情况下用 String url ="jdbc:mysql://localhost/BookStore"应该就能正常显示中文。<BR><BR><BR>&nbsp;&nbsp;&nbsp;总结：修改MySQL Server数据库默认字符集为“GB2312”，从MySQL读出中文可正常显示；</P>
<P>&nbsp;&nbsp; 例外： 此时仍有可能还有乱码，如本书光盘中的《在线书店》，请参见前面的说明。</P>
<P><BR><STRONG>【Step3】： 消除插入MySQL数据库中的中文乱码</STRONG></P>
<P>&nbsp;&nbsp; 此步比较简单，在JSP页面中加入如下代码：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setCharacterEncoding("GB2312");</P>]]></description>
</item><item>
<title><![CDATA[乱码问题（十五）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24079</link>
<author>krf301</author>
<pubDate>2007/4/16 22:45:59</pubDate>
<description><![CDATA[在基于 Java 语言的编程中，我们经常碰到汉字的处理及显示的问题。一大堆看不懂的乱码肯定不是我们愿意看到的显示效果，怎样才能够让那些汉字正确显示呢？Java 语言默认的编码方式是UNICODE ，而我们中国人通常使用的文件和数据库都是基于 GB2312 或者 BIG5 等方式编码的，怎样才能够恰当地选择汉字编码方式并正确地处理汉字的编码呢？本文将从汉字编码的常识入手，结合 Java 编程实例，分析以上两个问题并提出解决它们的方案。<FONT color=#ffffff>/JTi</FONT><BR><FONT color=#ffffff>&copy;达内科技论坛 -- 达内科技论坛　　4Z\Y.</FONT><BR>现在 Java 编程语言已经广泛应用于互联网世界，早在 Sun 公司开发 Java 语言的时候，就已经考虑到对非英文字符的支持了。Sun 公司公布的 Java 运行环境（JRE）本身就分英文版和国际版，但只有国际版才支持非英文字符。不过在 Java 编程语言的应用中，对中文字符的支持并非如同 Java Soft 的标准规范中所宣称的那样完美，因为中文字符集不只一个，而且不同的操作系统对中文字符的支持也不尽相同，所以会有许多和汉字编码处理有关的问题在我们进行应用开发中困扰着我们。有很多关于这些问题的解答，但都比较琐碎，并不能够满足大家迫切解决问题的愿望，关于 Java 中文问题的系统研究并不多，本文从汉字编码常识出发，分析 Java 中文问题，希望对大家解决这个问题有所帮助。<FONT color=#ffffff>FrC)r(</FONT><BR><B>汉字编码的常识</B> <FONT color=#ffffff>tu</FONT><BR>我们知道，英文字符一般是以一个字节来表示的，最常用的编码方法是 ASCII 。但一个字节最多只能区分256个字符，而汉字成千上万，所以现在都以双字节来表示汉字，为了能够与英文字符分开，每个字节的最高位一定为1，这样双字节最多可以表示64K格字符。我们经常碰到的编码方式有 GB2312、BIG5、UNICODE 等。关于具体编码方式的详细资料，有兴趣的读者可以查阅相关资料。我肤浅谈一下和我们关系密切的 GB2312 和 UNICODE。GB2312 码，中华人民共和国国家标准汉字信息交换用编码，是一个由中华人民共和国国家标准总局发布的关于简化汉字的编码，通行于中国大陆地区及新加坡，简称国标码。两个字节中，第一个字节（高字节）的值为区号值加32（20H），第二个字节（低字节）的值为位号值加32（20H），用这两个值来表示一个汉字的编码。UNICODE 码是微软提出的解决多国字符问题的多字节等长编码，它对英文字符采取前面加“0”字节的策略实现等长兼容。如 “A” 的 ASCII 码为0x41，UNICODE 就为0x00，0x41。利用特殊的工具各种编码之间可以互相转换。<FONT color=#ffffff>.Y -</FONT><BR><B>Java 中文问题的初步认识</B> <FONT color=#ffffff>Kr-</FONT><BR>我们基于 Java 编程语言进行应用开发时，不可避免地要处理中文。Java 编程语言默认的编码方式是 UNICODE，而我们通常使用的数据库及文件都是基于 GB2312 编码的，我们经常碰到这样的情况：浏览基于 JSP 技术的网站看到的是乱码，文件打开后看到的也是乱码，被 Java 修改过的数据库的内容在别的场合应用时无法继续正确地提供信息。 <FONT color=#ffffff>zoZKSK</FONT><BR>String sEnglish = “apple”; <FONT color=#ffffff>`_/r</FONT><BR>String sChinese = “苹果”; <FONT color=#ffffff>B{uVMA</FONT><BR>String s = “苹果 apple ”; <FONT color=#ffffff>I{</FONT><BR>sEnglish 的长度是5，sChinese的长度是4，而 s 默认的长度是14。对于 sEnglish来说， Java 中的各个类都支持得非常好，肯定能够正确显示。但对于 sChinese 和 s 来说，虽然 Java Soft 声明 Java 的基本类已经考虑到对多国字符的支持（默认 UNICODE 编码），但是如果操作系统的默认编码不是 UNICODE ，而是国标码等。从 Java 源代码到得到正确的结果，要经过 “Java 源代码-&gt; Java 字节码-&gt; ;虚拟机-&gt;操作系统-&gt;显示设备”的过程。在上述过程中的每一步骤，我们都必须正确地处理汉字的编码，才能够使最终的显示结果正确。 <FONT color=#ffffff>G!</FONT><BR>“ Java 源代码-&gt; Java 字节码”，标准的 Java 编译器 javac 使用的字符集是系统默认的字符集，比如在中文 Windows 操作系统上就是 GBK ,而在 Linux 操作系统上就是ISO-8859-1，所以大家会发现在 Linux 操作系统上编译的类中源文件中的中文字符都出了问题，解决的办法就是在编译的时候添加 encoding 参数，这样才能够与平台无关。用法是 <FONT color=#ffffff>M]9{m2</FONT><BR>javac –encoding GBK。 <FONT color=#ffffff>~,x</FONT><BR>“ Java 字节码-&gt;虚拟机-&gt;操作系统”， Java 运行环境 （JRE） 分英文版和国际版，但只有国际版才支持非英文字符。 Java 开发工具包 （JDK） 肯定支持多国字符，但并非所有的计算机用户都安装了 JDK 。很多操作系统及应用软件为了能够更好的支持 Java ，都内嵌了 JRE 的国际版本，为自己支持多国字符提供了方便。 <FONT color=#ffffff>:,[k</FONT><BR>“操作系统-&gt;显示设备”，对于汉字来说，操作系统必须支持并能够显示它。英文操作系统如果不搭配特殊的应用软件的话，是肯定不能够显示中文的。 <FONT color=#ffffff>lz</FONT><BR>还有一个问题，就是在 Java 编程过程中，对中文字符进行正确的编码转换。例如，向网页输出中文字符串的时候，不论你是用 <FONT color=#ffffff>)(^7K</FONT><BR>out.println(string); &nbsp; &nbsp; &nbsp; // string 是含中文的字符串 <FONT color=#ffffff>?Cxl7,</FONT><BR>还是用 <FONT color=#ffffff>X</FONT><BR>&lt;%=string%&gt;，都必须作 UNICODE 到 GBK 的转换，或者手动，或者自动。在 JSP 1.0中，可以定义输出字符集，从而实现内码的自动转换。用法是 <FONT color=#ffffff>=f#</FONT><BR>&lt;%@page ContentType=”text/html;charset=gb2312” %&gt; <FONT color=#ffffff>$</FONT><BR>但是在一些 JSP 版本中并没有提供对输出字符集的支持，（例如 JSP 0.92），这就需要手动编码输出了，方法非常多。最常用的方法是 <FONT color=#ffffff>a</FONT><BR>String s1 = request.getParameter(“keyword”); <FONT color=#ffffff>v=&gt;ni</FONT><BR>String s2 = new String(s1.getBytes(“ISO-8859-1”),”GBK”); <FONT color=#ffffff>}o}Z_h</FONT><BR>getBytes 方法用于将中文字符以“ISO-8859-1”编码方式转化成字节数组，而“GBK” 是目标编码方式。我们从以ISO-8859-1方式编码的数据库中读出中文字符串 s1 ，经过上述转换过程，在支持 GBK 字符集的操作系统和应用软件中就能够正确显示中文字符串 s2 。 <FONT color=#ffffff>/UmWD</FONT><BR><B>Java 中文问题的表层分析及处理</B> [TABLE][TR][TD]<FONT color=#ffffff>}9z}%S</FONT><BR>背景 [/TD][/TR][TR][TD]<FONT color=#ffffff>qo(6+</FONT><BR>开发环境 [/TD][TD]<FONT color=#ffffff>K9K%~</FONT><BR>JDK1.15 [/TD][TD]<FONT color=#ffffff>R=FDM</FONT><BR>Vcafe2.0 [/TD][TD]<FONT color=#ffffff>`</FONT><BR>JPadPro [/TD][/TR][TR][TD]<FONT color=#ffffff>N'</FONT><BR>服务器端 [/TD][TD]<FONT color=#ffffff>y*</FONT><BR>NT IIS [/TD][TD]<FONT color=#ffffff>D~_Pe</FONT><BR>Sybase System [/TD][TD]<FONT color=#ffffff>Q</FONT><BR>Jconnect（JDBC） [/TD][/TR][TR][TD]<FONT color=#ffffff>5f</FONT><BR>客户端 [/TD][TD]<FONT color=#ffffff>kbj</FONT><BR>IE5.0 [/TD][TD]<FONT color=#ffffff>U}]^x]</FONT><BR>Pwin98 [/TD][TD]<FONT color=#ffffff>3y^pJ7</FONT><BR>&nbsp;[/TD][/TR][/TABLE]<FONT color=#ffffff>9U</FONT><BR>.CLASS 文件存放在服务器端，由客户端的浏览器运行 APPLET ， APPLET 只起调入 FRAME 类等主程序的作用。界面包括 Textfield ，TextArea，List，Choice 等。 <FONT color=#ffffff>X+(m:</FONT><BR>I. &nbsp; &nbsp; &nbsp; 取中文 <FONT color=#ffffff>.!4X~</FONT><BR>用 JDBC 执行 SELECT 语句从服务器端读取数据（中文）后，将数据用 APPEND 方法加到 TextArea（TA） ，不能正确显示。但加到 List 中时，大部分汉字却可正确显示。 <FONT color=#ffffff>qQ</FONT><BR>将数据按“ISO-8859-1” 编码方式转化为字节数组，再按系统缺省编码方式 （Default Character Encoding） 转化为 STRING ，即可在 TA 和 List 中正确显示。 <FONT color=#ffffff>sGY"#y</FONT><BR>程序段如下： <FONT color=#ffffff>J_UdS5</FONT><BR>dbstr2 = results.getString(1); <FONT color=#ffffff>#O</FONT><BR>//After reading the result from DB server，converting it to string. <FONT color=#ffffff>-k(a6f</FONT><BR>dbbyte1 = dbstr2.getBytes(“iso-8859-1”); <FONT color=#ffffff>&lt;|7`Z</FONT><BR>dbstr1 = new String(dbbyte1); <FONT color=#ffffff>2Mk+I</FONT><BR>在转换字符串时不采用系统默认编码方式，而直接采用“ GBK” 或者 “GB2312” ,在 A 和 B 两种情况下，从数据库取数据都没有问题。 <FONT color=#ffffff>f0^a</FONT><BR>II. &nbsp; &nbsp;写中文到数据库 <FONT color=#ffffff>E</FONT><BR>处理方式与“取中文”相逆，先将 SQL 语句按系统缺省编码方式转化为字节数组，再按“ISO-8859-1”编码方式转化为 STRING ，最后送去执行，则中文信息可正确写入数据库。 <FONT color=#ffffff>;</FONT><BR>程序段如下： <FONT color=#ffffff>2{"*K</FONT><BR>sqlstmt = tf_input.getText(); <FONT color=#ffffff>v</FONT><BR>//Before sending statement to DB server，converting it to sql statement. <FONT color=#ffffff>&gt;3IM</FONT><BR>dbbyte1 = sqlstmt.getBytes(); <FONT color=#ffffff>f_bw</FONT><BR>sqlstmt = newString(dbbyte1,”iso-8859-1”); <FONT color=#ffffff>oE*E</FONT><BR>_stmt = _con.createStatement(); <FONT color=#ffffff>y</FONT><BR>_stmt.executeUpdate(sqlstmt); <FONT color=#ffffff>B,&lt;i[</FONT><BR>…… <FONT color=#ffffff>&copy;达内科技论坛 -- 达内科技论坛　　#l</FONT><BR>问题：如果客户机上存在 CLASSPATH 指向 JDK 的 CLASSES.ZIP 时（称为 A 情况），上述程序代码可正确执行。但是如果客户机只有浏览器，而没有 JDK 和 CLASSPATH 时（称为 B 情况），则汉字无法正确转换。 <FONT color=#ffffff>K</FONT><BR>我们的分析： <FONT color=#ffffff>A</FONT><BR>1.经过测试，在 A 情况下，程序运行时系统的缺省编码方式为 GBK 或者 GB2312 。在 B 情况下，程序启动时浏览器的 JAVA 控制台中出现如下错误信息： <FONT color=#ffffff>{w</FONT><BR>Can't find resource for sun.awt.windows.awtLocalization_zh_CN <FONT color=#ffffff>v4</FONT><BR>然后系统的缺省编码方式为“8859-1”。 <FONT color=#ffffff>XZ</FONT><BR>2.如果在转换字符串时不采用系统缺省编码方式，而是直接采用 “GBK” 或“GB2312”，则在 A 情况下程序仍然可正常运行，在 B 情况下，系统出现错误： <FONT color=#ffffff>P8u%R</FONT><BR>UnsupportedEncodingException。 <FONT color=#ffffff>x@</FONT><BR>3.在客户机上，把 JDK 的 CLASSES.ZIP 解压后，放在另一个目录中， CLASSPATH 只包含该目录。然后一边逐步删除该目录中的 .CLASS 文件，另一边运行测试程序，最后发现在一千多个 CLASS 文件中，只有一个是必不可少的，该文件是： <FONT color=#ffffff>Rh</FONT><BR>sun.io.CharToByteDoubleByte.class。 <FONT color=#ffffff>Y"</FONT><BR>将该文件拷到服务器端和其它的类放在一起，并在程序的开头 IMPORT 它，在 B 情况下程序仍然无法正常运行。 <FONT color=#ffffff>r8@kQl</FONT><BR>4.在 A 情况下，如果在 CLASSPTH 中去掉 sun.io.CharToByteDoubleByte.class ，则程序运行时测得默认编码方式为“8859-1”，否则为 “GBK” 或 “GB2312” 。 <FONT color=#ffffff>!e%*|</FONT><BR>如果 JDK 的版本为1.2以上的话，在 B 情况下遇到的问题得到了很好的解决，测试的步骤同上，有兴趣的读者可以尝试一下。 <FONT color=#ffffff>PtS</FONT><BR><B>Java 中文问题的根源分析及解决</B> <FONT color=#ffffff>?</FONT><BR>在简体中文 MS Windows 98 + JDK 1.3 下，可以用 System.getProperties() 得到 Java 运行环境的一些基本属性，类 PoorChinese 可以帮助我们得到这些属性。 <FONT color=#ffffff>QG</FONT><BR>类 PoorChinese 的源代码： <FONT color=#ffffff>IbE:v</FONT><BR>public class PoorChinese { <FONT color=#ffffff>t</FONT><BR>&nbsp; public static void main(String[] args) { <FONT color=#ffffff>bjo}C</FONT><BR>&nbsp; &nbsp; &nbsp; System.getProperties().list(System.out); <FONT color=#ffffff>)K$nl</FONT><BR>&nbsp; } <FONT color=#ffffff>v&gt;M</FONT><BR>} <FONT color=#ffffff>&copy;达内科技论坛 -- 达内科技论坛　　5uAq4</FONT><BR>执行 java PoorChinese 后，我们会得到: <FONT color=#ffffff>G#b</FONT><BR>系统变量 file.encoding 的值为 GBK ，user.language 的值为 zh ， user.region 的值为 CN ，这些系统变量的值决定了系统默认的编码方式是 GBK 。 <FONT color=#ffffff>@;qR#K</FONT><BR>在上述系统中，下面的代码将 GB2312 文件转换成 Big5 文件，它们能够帮助我们理解 Java 中汉字编码的转化: <FONT color=#ffffff>M</FONT><BR>&nbsp;<FONT color=#ffffff>$fl8)-</FONT><BR>import java.io.*; <FONT color=#ffffff>n&gt;sQ</FONT><BR>import java.util.*; <FONT color=#ffffff>eeQK6</FONT><BR>&nbsp;<FONT color=#ffffff>I</FONT><BR>public class gb2big5 { <FONT color=#ffffff>3L</FONT><BR>&nbsp;<FONT color=#ffffff>3S)&amp;m</FONT><BR>static int iCharNum=0; <FONT color=#ffffff>&gt;SX</FONT><BR>&nbsp;<FONT color=#ffffff>&gt;S@wh@</FONT><BR>public static void main(String[] args) { <FONT color=#ffffff>k:</FONT><BR>System.out.println("Input GB2312 file, output Big5 file."); <FONT color=#ffffff>'</FONT><BR>if (args.length!=2) { <FONT color=#ffffff>'`</FONT><BR>System.err.println("Usage: jview gb2big5 gbfile big5file"); <FONT color=#ffffff>8k H{</FONT><BR>System.exit(1); <FONT color=#ffffff>empH\</FONT><BR>&nbsp; } <FONT color=#ffffff>UXuB</FONT><BR>String inputString = readInput(args[0]); <FONT color=#ffffff>"O};</FONT><BR>writeOutput(inputString,args[1]); <FONT color=#ffffff>~</FONT><BR>System.out.println("Number of Characters in file: "+iCharNum+"."); <FONT color=#ffffff>N</FONT><BR>} <FONT color=#ffffff>&copy;达内科技论坛 -- 达内科技论坛　　&gt;TR</FONT><BR>&nbsp;<FONT color=#ffffff>"e@</FONT><BR>static void writeOutput(String str, String strOutFile) { <FONT color=#ffffff>^b</FONT><BR>try { <FONT color=#ffffff>iX</FONT><BR>FileOutputStream fos = new FileOutputStream(strOutFile); <FONT color=#ffffff>a[*:$</FONT><BR>Writer out = new OutputStreamWriter(fos, "Big5"); <FONT color=#ffffff>xA"i-)</FONT><BR>out.write(str); <FONT color=#ffffff>tVUcV</FONT><BR>out.close(); <FONT color=#ffffff>PRZ[</FONT><BR>} <FONT color=#ffffff>&copy;达内科技论坛 -- 达内科技论坛　　Y5</FONT><BR>catch (IOException e) { <FONT color=#ffffff>-.fbA</FONT><BR>e.printStackTrace(); <FONT color=#ffffff>R3</FONT><BR>e.printStackTrace(); <FONT color=#ffffff>(uFOQ</FONT><BR>} <FONT color=#ffffff>&copy;达内科技论坛 -- 达内科技论坛　　msoB</FONT><BR>} <FONT color=#ffffff>&copy;达内科技论坛 -- 达内科技论坛　　&gt;H,,</FONT><BR>&nbsp;<FONT color=#ffffff>^k{-</FONT><BR>static String readInput(String strInFile) { <FONT color=#ffffff>ug'v)</FONT><BR>StringBuffer buffer = new StringBuffer(); <FONT color=#ffffff>l4!Y-</FONT><BR>try { <FONT color=#ffffff>I</FONT><BR>FileInputStream fis = new FileInputStream(strInFile); <FONT color=#ffffff>Q3=</FONT><BR>InputStreamReader isr = new InputStreamReader(fis, "GB2312"); <FONT color=#ffffff>mP&lt;su</FONT><BR>Reader in = new BufferedReader(isr); <FONT color=#ffffff>K}</FONT><BR>int ch; <FONT color=#ffffff>Eit(@</FONT><BR>while ((ch = in.read()) &gt; -1) { <FONT color=#ffffff>c+</FONT><BR>iCharNum += 1; <FONT color=#ffffff>uo#,|r</FONT><BR>buffer.append((char)ch); <FONT color=#ffffff>_-</FONT><BR>} <FONT color=#ffffff>&copy;达内科技论坛 -- 达内科技论坛　　xl,2\</FONT><BR>in.close(); <FONT color=#ffffff>#m]Mz</FONT><BR>return buffer.toString(); <FONT color=#ffffff>1D</FONT><BR>} <FONT color=#ffffff>&copy;达内科技论坛 -- 达内科技论坛　　dK;7j1</FONT><BR>catch (IOException e) { <FONT color=#ffffff>cNh(&gt;</FONT><BR>e.printStackTrace(); <FONT color=#ffffff>jM(</FONT><BR>return null; <FONT color=#ffffff>e</FONT><BR>} <FONT color=#ffffff>&copy;达内科技论坛 -- 达内科技论坛　　,</FONT><BR>} <FONT color=#ffffff>&copy;达内科技论坛 -- 达内科技论坛　　SE(</FONT><BR>} <FONT color=#ffffff>&copy;达内科技论坛 -- 达内科技论坛　　#'a@</FONT><BR>&nbsp;<FONT color=#ffffff>!,H</FONT><BR>编码转化的过程如下： <FONT color=#ffffff>#!I</FONT><BR>&nbsp; &nbsp; &nbsp; ByteToCharGB2312 &nbsp; &nbsp; &nbsp; &nbsp; CharToByteBig5 <FONT color=#ffffff>^</FONT><BR>GB2312------------------&gt;Unicode-------------&gt;Big5 <FONT color=#ffffff>Lo"e</FONT><BR>执行 java gb2big5 gb.txt big5.txt ，如果 gb.txt 的内容是“今天星期三”，则得到的文件 big5.txt 中的字符能够正确显示；而如果 gb.txt 的内容是“情人节快乐”，则得到的文件 big5.txt 中对应于“节”和“乐”的字符都是符号“？”（0x3F），可见 sun.io.ByteToCharGB2312 和 sun.io.CharToByteBig5 这两个基本类并没有编好。 <FONT color=#ffffff>Iu?l!0</FONT><BR>正如上例一样， Java 的基本类也可能存在问题。由于国际化的工作并不是在国内完成的，所以在这些基本类发布之前，没有经过严格的测试，所以对中文字符的支持并不像 Java Soft 所声称的那样完美。前不久，我的一位技术上的朋友发信给我说，他终于找到了<B> Java Servlet 中文问题的根源</B>。两周以来，他一直为 Java Servlet 的中文问题所困扰，因为每面对一个含有中文字符的字符串都必须进行强制转换才能够得到正确的结果（这好象是大家公认的唯一的解决办法）。后来，他确实不想如此继续安分下去了，因为这样的事情确实不应该是高级程序员所要做的工作，他就找出 Servlet 解码的源代码进行分析，因为他怀疑问题就出在解码这部分。经过四个小时的奋斗，他终于找到了问题的根源所在。原来他的怀疑是正确的， Servlet 的解码部分完全没有考虑双字节，直接把 %XX 当作一个字符。（原来 Java Soft 也会犯这幺低级的错误！） <FONT color=#ffffff>I&gt;io</FONT><BR>如果你对这个问题有兴趣或者遇到了同样的烦恼的话，你可以按照他的步骤<B>对</B><B> Servlet.jar 进行修改</B>： <FONT color=#ffffff>Q&lt;: N</FONT><BR>找到源代码 HttpUtils 中的 static private String parseName ，在返回前将 sb（StringBuffer） 复制成 byte bs[] ，然后 return new String(bs,”GB2312”)。作上述修改后就需要自己解码了： <FONT color=#ffffff>5{~</FONT><BR>HashTable form=HttpUtils .parseQueryString(request.getQueryString())或者 <FONT color=#ffffff>&gt;?rCS</FONT><BR>form=HttpUtils.parsePostData(……) <FONT color=#ffffff>l&amp; </FONT><BR>千万别忘了编译后放到 Servlet.jar 里面。 <FONT color=#ffffff>U</FONT><BR>五、 关于 Java 中文问题的总结 <FONT color=#ffffff>i1EYD</FONT><BR>Java 编程语言成长于网络世界，这就要求 Java 对多国字符有很好的支持。 Java 编程语言适应了计算的网络化的需求，为它能够在网络世界迅速成长奠定了坚实的基础。 Java 的缔造者 （Java Soft） 已经考虑到 Java 编程语言对多国字符的支持，只是现在的解决方案有很多缺陷在里面，需要我们付诸一些补偿性的措施。而世界标准化组织也在努力把人类所有的文字统一在一种编码之中，其中一种方案是 ISO10646 ，它用四个字节来表示一个字符。当然，在这种方案未被采用之前，还是希望 Java Soft 能够严格地测试它的产品，为用户带来更多的方便。 <FONT color=#ffffff>O%</FONT><BR><B>附</B>一个用于从数据库和网络中取出<B>中文乱码的处理函数</B>，入参是有问题的字符串，出参是问题已经解决了的字符串。 <FONT color=#ffffff>l1+c</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp;String parseChinese(String in) <FONT color=#ffffff>_9</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp;{ <FONT color=#ffffff>j.CS</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;String s = null; <FONT color=#ffffff>$"~e</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;byte temp []; <FONT color=#ffffff>N</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (in == null) <FONT color=#ffffff>t$6</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <FONT color=#ffffff>h3PD{</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println("Warn:Chinese null founded!"); <FONT color=#ffffff>a5$v</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return new String(""); <FONT color=#ffffff>[</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <FONT color=#ffffff>6i</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;try <FONT color=#ffffff>GV6G&gt;o</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <FONT color=#ffffff>,1</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;temp=in.getBytes("iso-8859-1"); <FONT color=#ffffff>&gt;.B</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;temp=in.getBytes("iso-8859-1"); <FONT color=#ffffff>_$</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;s = new String(temp); <FONT color=#ffffff>O&amp;6NW^</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <FONT color=#ffffff>k</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <FONT color=#ffffff>fU</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println("Warn:Chinese null founded!"); <FONT color=#ffffff>Z~`0WM</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return new String(""); <FONT color=#ffffff>fUPL</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <FONT color=#ffffff>$],</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;try <FONT color=#ffffff>\fP|x</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <FONT color=#ffffff>VD1</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;temp=in.getBytes("iso-8859-1"); <FONT color=#ffffff>(#P</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;s = new String(temp); <FONT color=#ffffff>}uEHZ</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <FONT color=#ffffff>3</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;catch(UnsupportedEncodingException e) <FONT color=#ffffff>]K</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <FONT color=#ffffff>A|m3X</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println (e.toString()); <FONT color=#ffffff>Rv</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <FONT color=#ffffff>Zho#s</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return s; <FONT color=#ffffff>Q(1</FONT><BR>&nbsp; &nbsp; &nbsp; &nbsp;} <FONT color=#ffffff>LZ7G</FONT><BR><FONT color=#ffffff>&copy;达内科技论坛 -- 达内科技论坛　　,l</FONT><BR><B>参考资料</B>[UL][LI][url href=http://smth.org/SMTH2000/bbsdoc?NJava]BBS 水木清华站的 Java 讨论区[/url]<FONT color=#ffffff>(</FONT><BR><FONT color=#ffffff>&copy;达内科技论坛 -- 达内科技论坛　　!</FONT><BR>[UL][LI]中国最大的电子公告板的 Java 讨论区，有众多高校的 Java 爱好者在此进行关于 Java 技术的讨论 [/LI][/UL][/LI][/UL]<FONT color=#ffffff>},~</FONT><BR><B>作者简介</B> [UL][LI]段明辉(<A href="mailto:duanmh@dns.ime.tsinghua.edu.cn">duanmh@dns.ime.tsinghua.edu.cn</A>)，清华大学电子工程系学生 [UL][LI]现在正在清华大学微电子学研究所从事 Java 智能卡微处理器的研究和开发 [LI]领导 BBS 水木清华站的 Java 讨论组，为众多 Java 技术应用者提供解决方案 [/LI][/UL][/LI][/UL]<FONT color=#ffffff>R=</FONT>]]></description>
</item><item>
<title><![CDATA[乱码问题（十四）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24078</link>
<author>krf301</author>
<pubDate>2007/4/16 22:44:28</pubDate>
<description><![CDATA[<STRONG>中文乱码问题初步解决方案</STRONG>
<DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" onload="this.style.overflowX='auto';">
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l1 level1 lfo1"><FONT face="Times New Roman"><SPAN lang=EN-US style="mso-bidi-font-family: 宋体"><SPAN style="mso-list: ignore">一、</SPAN></SPAN><SPAN lang=EN-US>request</SPAN></FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">参数的乱码问题</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">现象描述</SPAN></B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman">login.html<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>--&gt;<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>test.jsp</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman">login.html</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">中要求用户在表单中输入<B style="mso-bidi-font-weight: normal">用户名和密码</B>。如果用户输入的用户名为中文，则</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">test.jsp</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">获取此参数时为乱码。注意：此时的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">URL</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">为：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman">http://localhost:8083/myweb/test.jsp?username=<B style="mso-bidi-font-weight: normal">%D6%D0%CE%C4</B></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">处理方法有三种</SPAN></B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; tab-stops: list 18.0pt; mso-list: l4 level1 lfo4"><SPAN lang=EN-US style="mso-fareast-font-family: '"><SPAN style="mso-list: ignore"><FONT face="Times New Roman">1)<SPAN style="FONT: 7pt '">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">对</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">request.getParameter(“…”)</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">取到的参数逐个</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">new String(xxx.getBytes(“ISO-8859<CHMETCNV wst="on" tcsc="0" numbertype="1" negative="True" hasspace="False" sourcevalue="1" unitname="”">-1”</CHMETCNV>), ”gbk”);</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; tab-stops: list 18.0pt; mso-list: l4 level1 lfo4"><SPAN lang=EN-US style="mso-fareast-font-family: '"><SPAN style="mso-list: ignore"><FONT face="Times New Roman">2)<SPAN style="FONT: 7pt '">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></FONT></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">在</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">getParameter</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">获取参数之前之前调用</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Request.setCharacterEncoding(“gbk”);</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; tab-stops: list 18.0pt; mso-list: l4 level1 lfo4"><FONT face="Times New Roman"><SPAN lang=EN-US style="mso-fareast-font-family: '"><SPAN style="mso-list: ignore">3)<SPAN style="FONT: 7pt '">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US>Filter</SPAN></FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">方式</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>
<P><FONT face="Times New Roman">&nbsp;</FONT></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>
<P><FONT face="Times New Roman">&nbsp;</FONT></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">相关问题：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">如果需要在</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">sendRedirect</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">中自己指定</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">URL</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">中的参数，如果写：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman">res.sendRedirect("/myweb/test.jsp?username=</FONT></SPAN><SPAN style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">中文</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">”); </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">则会出错。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">处理方法：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">只要能将上述</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">URL</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">中的参数写成</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">”<B style="mso-bidi-font-weight: normal"> %D6%D0%CE%C<CHMETCNV wst="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="4" unitname="”">4<SPAN style="FONT-WEIGHT: normal">”</SPAN></CHMETCNV></B></FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">格式就可以使用前面的方法解决。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">通过下述代码可以实现这样的目的：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman">String new = java.net.URLEncoder.encode("</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">中文</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">","GB2312");<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>//</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">此时的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">new</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">值即为</SPAN><FONT face="Times New Roman"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US>%D6%D0%CE%C4</SPAN></B><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'mso-hansi-font-family:'">然后</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">res.sendRedirect(“/myweb/test.jsp?username=”+new);</FONT></SPAN></P></DIV>]]></description>
</item><item>
<title><![CDATA[乱码问题（十三）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24077</link>
<author>krf301</author>
<pubDate>2007/4/16 22:31:01</pubDate>
<description><![CDATA[
<DIV class=tit>解决web服务器各种应用的乱码问题</DIV>
<TABLE style="TABLE-LAYOUT: fixed">
<TBODY>
<TR>
<TD>
<DIV class=cnt>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD align=middle height=20></TD></TR>
<TR>
<TD align=middle height=30>&nbsp;</TD></TR>
<TR>
<TD class=l17><FONT class=f14>
<TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><BR><STRONG>乱码问题：</STRONG> <BR><BR>（1）服务器端： <BR>修改httpd.conf (在Redhat中放置的位置为/etc/httpd/conf/) <BR>查找： <BR>AddDefaultCharset ISO-8859-1 <BR>改成： <BR><PRE>#AddDefaultCharset ISO-8859-1 <BR><BR><BR><BR>AddDefaultCharset off </PRE>] <BR><BR>这种方式关掉了服务器的默认语言的发送，这样仅凭html文件头中设置的语言来决定网页语言。 <BR><BR>很多文章都说通过修改为 AddDefaultCharset GB2312 把缺省语言改成GB2312来解决中文乱码，确实GB2312内码 的网页可以正常显示了，但这并非万全之策。因为当你的网页内码不是GB2312，就算你在网页用下面的meta指定了正确的语言，如ISO8859-1， 也不会解码为ISO8859-1，因为Apache已经先你一步将GB2312指定为网页的语言了， <BR><BR><BR>（2）养成良好的习惯，在每个网页的&lt;head&gt;;&lt;/head&gt;;的最前面加入这行： <BR><BR><PRE>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;; </PRE><BR><BR>一般的中文版网页编辑工具（例如FrontPage、Dreamweaver等）都会自动加上这行。 <BR><BR>3、如何解决中文文件名无法访问 <BR><BR><PRE>　在ie中选择 工具 -&gt;; internet选项 -&gt;; 高级 -&gt;; 取消“总是以UTF-8发送URL”。 </PRE><BR><BR><BR><BR><STRONG>UTF-8网页空白，在网页中加上metadata标识后，还需要手动调整编码為 utf-8 才能正常显示</STRONG> <BR><BR>如果使用的是Mozilla、Mozilla Firefox、Sarafi等其他目前流行的浏览器，通常就不会有这样的问题。 <BR><BR>在网页的meta中指定用UTF-8： <BR><PRE>&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;; </PRE><BR><BR>在&lt;head&gt;;&lt;/head&gt;;之前，把"Content-Type"放在最前面，便可以解決这样的问题了。 <BR><BR>原因： <BR><BR>IE 解析网页编码时是 HTML 內的标识优先的，然后是 HTTP header ；而mozilla 系列的浏览器刚刚好相反。 <BR><BR>一般情况在，很多人是把&lt;title&gt;;&lt;/title&gt;;排在最前面，并且在title中就出现了UTF-8中文，这 样，IE在解析时，就先遇到UTF-8，不往下解析了，因此必须把如果把meta放在UTF-8出现之前，这样IE才能判断这个网页是以UTF-8编码 的。 <BR><BR><BR>总之： <BR>无论是 PHP、JSP、ASP 或其他动态网页的脚本语言，如果需要作编码设定，最好放在最前面。 <BR><BR><STRONG>使用php,也可以定义php的默认语言. </STRONG><BR><BR>php.ini中： <BR><BR><PRE>default_charset = "gb2312" </PRE><BR><BR>释掉此行，做了以上修改，一样是为了让浏览器根据网页头中的charset来自动选择语言，这样就可以在同台服务器上提供多种语言的网页服务。 <BR><BR><BR><STRONG>java中文乱码的解决 </STRONG><BR><BR>转 <BR><BR><BR>在基于JAVA的编程中，经常会碰到汉字的处里及显示的问题，比如一大堆乱码或问号。 <BR>这是因为JAVA中默认的编码方式是UNICODE，而中国人通常使用的文件和DB都是基于GB2312或者BIG5等编码，故会出现此问题。 <BR><BR><STRONG>1、在网页中输出中文。</STRONG> <BR><BR>JAVA在网络传输中使用的编码是"ISO-8859-1"，故在输出时需要进行转化，如： <BR>String&nbsp;&nbsp; str="中文"; <BR>str=new&nbsp;&nbsp; String(str.getBytes("GB2312"),"8859_1"); <BR>但如果在编译程序时，使用的编码是“GB2312”,且在中文平台上运行此程序，不会出现此问题，一定要注意。 <BR><BR><STRONG>2、从参数中读取中文</STRONG> <BR><BR>这正好与在网页中输出相反如： <BR>str=new&nbsp;&nbsp; String(str.getBytes("8859_1"),"GB2312"); <BR><BR><STRONG>3、操作DB中的中文问题</STRONG> <BR><BR>一个较简单的方法是：在“控制面扳”中，把“区域”设置为“英语(美国)”。如果还会出现乱码，还可进行如下设置： <BR>取中文时：str=new&nbsp;&nbsp; String(str.getBytes("GB2312")); <BR>向DB中输入中文：str=new&nbsp;&nbsp; String(str.getBytes("ISO-8859-1")); <BR><BR><STRONG>4、在JSP中的中文解决：</STRONG> <BR><BR>在“控制面扳”中，把“区域”设置为“英语(美国)”. <BR>在JSP页面中加入： <BR>如果还不行正常显示，则还要进行下面的转换： <BR>如：name=new&nbsp;&nbsp; String(name.getBytes("ISO-8859-1"),"GBK"); <BR>就不会出现中文问题了。 <BR><BR><STRONG>CGI的？不知道对不？</STRONG> <BR><BR>找到CGI.pm，打开它，找到$self-&gt;;charset('ISO-8859-1');将它改为$self-&gt;;charset('GB2312');</TD></TR></TBODY></TABLE></FONT></TD></TR></TBODY></TABLE></DIV></TD></TR></TBODY></TABLE>]]></description>
</item><item>
<title><![CDATA[乱码问题（十二）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24075</link>
<author>krf301</author>
<pubDate>2007/4/16 22:29:06</pubDate>
<description><![CDATA[<STRONG><SPAN class=tpc_title>关于java中文乱码问题一些解决方案和经验</SPAN><BR><BR></STRONG><SPAN class=tpc_content><FONT size=2>java内核是unicode的，就连class文件也是，但是很多媒体，包括文件/流的保存方式是使用字节流的。因此java要对这些字节流经行转化。char是unicode的，而byte是字节。java中byte/char互转的函数在sun.io的包中间有。其中ByteToCharConverter类是中调度，可以用来告诉你，你用的convertor。其中两个很常用的静态函数是 </FONT><CODE><BR><FONT face=新宋体 size=2>publicstaticByteToCharConvertergetDefault(); <BR>publicstaticByteToCharConvertergetConverter(Stringencoding); <BR></FONT></CODE><FONT size=2>如果你不指定converter，则系统会自动使用当前的encoding,gb平台上用gbk,en平台上用8859_1。 <BR>byte——〉char： <BR>"你"的gb码是：0xc4e3,unicode是0x4f60 </FONT><CODE><BR><FONT face=新宋体><FONT size=2>Stringencoding="gb2312"; <BR>byteb[]={(byte)'\u00c4',(byte)'\u00e3'}; <BR>ByteToCharConverterconverter=ByteToCharConverter.getConverter(encoding); <BR>charc[]=converter.convertAll(b); <BR>for(inti=0;i＜c.length;i++){ <BR>System.out.println(Integer.toHexString(c</FONT><I><FONT size=2>)); <BR>}</FONT></FONT></CODE><FONT size=2> <BR>结果是什么？0x4f60 <BR>如果encoding="8859_1"，结果又是什么？0x00c4,0x00e3 <BR>如果代码改为 <BR>byteb[]={(byte)'\u00c4',(byte)'\u00e3'}; <BR>ByteToCharConverterconverter=ByteToCharConverter.getDefault(); <BR>charc[]=converter.convertAll(b); <BR>for(inti=0;i＜c.length;i++){ <BR>System.out.println(Integer.toHexString(c</FONT><I><FONT size=2>)); <BR>} <BR>结果将又是什么？根据平台的编码而定。 <BR>char——〉byte： <BR>Stringencoding="gb2312"; <BR>charc[]={'\u4f60'}; <BR>CharToByteConverterconverter=CharToByteConverter.getConverter(encoding); <BR>byteb[]=converter.convertAll(c); <BR>for(inti=0;i＜b.length;i++){ <BR>System.out.println(Integer.toHexString(b</FONT><I><FONT size=2>)); <BR>} <BR>结果是什么？0x00c4,0x00e3 <BR>如果encoding="8859_1"，结果又是什么？0x3f <BR>如果代码改为 </FONT><CODE><BR><FONT face=新宋体><FONT size=2>Stringencoding="gb2312"; <BR>charc[]={'\u4f60'}; <BR>CharToByteConverterconverter=CharToByteConverter.getDefault(); <BR>byteb[]=converter.convertAll(c); <BR>for(inti=0;i＜b.length;i++){ <BR>System.out.println(Integer.toHexString(b</FONT><I><FONT size=2>)); <BR>} </FONT></FONT></CODE><BR><FONT size=2>结果将又是什么？根据平台的编码而定。 <BR>很多中文问题就是从这两个最简单的类派生出来的。而却有很多类不直接支持把encoding输入，这给我们带来诸多不便。很多程序难得用encoding了，直接用default的encoding，这就给我们移植带来了很多困难。 <BR><STRONG>&nbsp;&nbsp;&nbsp; 2.utf-8 </STRONG><BR>utf-8是和unicode一一对应的，其实现很简单 <BR>7位的unicode:0_______ <BR>11位的unicode:110_____10______ <BR>16位的unicode:1110____10______10______ <BR>21位的unicode:11110___10______10______10______ <BR>大多数情况是只使用到16位以下的unicode: <BR>"你"的gb码是：0xc4e3,unicode是0x4f60 <BR>0xc4e3的二进制： <BR>1100，0100，1110，0011 <BR>由于只有两位我们按照两位的编码来排，但是我们发现这行不通，因为第７位不是0因此，返回"?" <BR>0x4f60的二进制： <BR>0100，1111，0110，0000 <BR>我们用utf-8补齐，变成： <BR>1110，0100，1011，1101，1010，0000 <BR>e4--bd--a0 <BR>于是返回：0xe4,0xbd,0xa0。 <BR><STRONG>&nbsp;&nbsp;&nbsp; 3.string和byte[] </STRONG><BR>string其实核心是char[],然而要把byte转化成string，必须经过编码。string.length()其实就是char数组的长度，如果使用不同的编码，很可能会错分，造成散字和乱码。 <BR>例如：</FONT><FONT size=2><CODE><FONT face=新宋体> <BR>Stringencoding=“”; <BR>byte[]b={(byte)'\u00c4',(byte)'\u00e3'}; <BR>Stringstr=newString(b,encoding); <BR></FONT></CODE>如果encoding=8859_1，会有两个字，但是encoding=gb2312只有一个字这个问题在处理分页是经常发生。 <BR><STRONG>&nbsp;&nbsp;&nbsp;&nbsp; 4.Reader,Writer/InputStream,OutputStream </STRONG><BR>Reader和Writer核心是char，InputStream和OutputStream核心是byte。但是Reader和Writer的主要目的是要把char读/写InputStream/OutputStream。 <BR>例如： <BR>文件test.txt只有一个"你"字，0xc4,0xe3 </FONT><CODE><BR><FONT face=新宋体><FONT size=2>Stringencoding="gb2312"; <BR>InputStreamReaderreader=newInputStreamReader(newFileInputStream( <BR>"text.txt"),encoding); <BR>charc[]=newchar[10]; <BR>intlength=reader.read(c); <BR>for(inti=0;i＜length;i++){ <BR>System.out.println(c</FONT><I><FONT size=2>); <BR>}</FONT></FONT></CODE><FONT size=2> <BR>结果是什么？你 <BR>如果encoding="8859_1"，结果是什么？??两个字符，表示不认识。 <BR>反过来的例子自己做。 <BR><STRONG>&nbsp;&nbsp;&nbsp; 5.我们要对java的编译器有所了解 </STRONG>： <BR>javac?encoding <BR>我们常常没有用到encoding这个参数。其实encoding这个参数对于跨平台的操作是很重要的。如果没有指定encoding，则按照系统的默认encoding,gb平台上是gb2312，英文平台上是iso8859_1。 <BR>java的编译器实际上是调用sun.tools.javac.main的类，对文件进行编译，这个类有compile函数中间有一个encoding的变量,-encoding的参数其实直接传给encoding变量。编译器就是根据这个变量来读取java文件的，然后把用utf-8形式编译成class文件。 <BR>例子代码： <BR>Stringstr="你"; <BR>FileWriterwriter=newFileWriter("text.txt"); <BR>write.write(str); <BR>writer.close(); <BR>如果用gb2312编译，你会找到e4bda0的字段； <BR>如果用8859_1编译，00c400e3的二进制： <BR>0000，0000，1100，0100，0000，0000，1110，0011 <BR>因为每个字符都大于7位，因此用11位编码： <BR>1100，0001，1000，0100，1100，0011，1010，0011 <BR>c1--84--c3--a3 <BR>你会找到c184c3a3。 <BR>但是我们往往忽略掉这个参数，因此这样往往会有跨平台的问题： <BR>样例代码在中文平台上编译，生成zhclass <BR>样例代码在英文平台上编译，输出enclass <BR>(1).zhclass在中文平台上执行ok,但是在英文平台上不行 <BR>(2).enclass在英文平台上执行ok,但是在中文平台上不行 <BR>原因： <BR>(1).在中文平台上编译后，其实str在运行态的char[]是0x4f60,在中文平台上运行，filewriter的缺省编码是gb2312,因此chartobyteconverter会自动用调用gb2312的converter,把str转化成byte输入到fileoutputstream中，于是0xc4,0xe3放进了文件。 <BR>但是如果是在英文平台下，chartobyteconverter的缺省值是8859_1,filewriter会自动调用8859_1去转化str,但是他无法解释，因此他会输出"?" <BR>(2).在英文平台上编译后，其实str在运行态的char[]是0x00c40x00e3,在中文平台上运行，中文无法识别，因此会出现??； <BR>在英文平台上，0x00c4--&gt;0xc4,0x00e3-&gt;0xe3，因此0xc4,0xe3被放进了文件。 <BR></FONT><FONT size=2><STRONG>&nbsp;&nbsp;&nbsp; 6.其它原因： <BR></STRONG>＜%@pagecontentType="text/html;charset=GBK"%&gt; <BR>设置浏览器的显示编码，如果response的数据是utf8编码，显示将是乱码，但是乱码和上述原因还不一样。 <BR><STRONG>&nbsp;&nbsp;&nbsp; 7.发生编码的地方 </STRONG>： <BR>&#61548;从数据库到java程序byte——〉char <BR>&#61548;从java程序到数据库char——〉byte <BR>&#61548;从文件到java程序byte——〉char <BR>&#61548;从java程序到文件char——〉byte <BR>&#61548;从java程序到页面显示char——〉byte <BR>&#61548;从页面form提交数据到java程序byte——〉char <BR>&#61548;从流到java程序byte——〉char <BR>&#61548;从java程序到流char——〉byte <BR>谢志钢的解决方法： <BR>我是使用配置过滤器的方法解决中文乱码的： </FONT><CODE><BR><FONT face=新宋体 size=2>＜web-app&gt; <BR>＜filter&gt; <BR>＜filter-name&gt;RequestFilter＜/filter-name&gt; <BR>＜filter-class&gt;net.golden.uirs.util.RequestFilter＜/filter-class&gt; <BR>＜init-param&gt; <BR>＜param-name&gt;charset＜/param-name&gt; <BR>＜param-value&gt;gb2312＜/param-value&gt; <BR>＜/init-param&gt; <BR>＜/filter&gt; <BR>＜filter-mapping&gt; <BR>＜filter-name&gt;RequestFilter＜/filter-name&gt; <BR>＜url-pattern&gt;*.jsp＜/url-pattern&gt; <BR>＜/filter-mapping&gt; <BR>＜/web-app&gt; <BR></FONT></CODE><CODE><FONT face=新宋体 size=2>publicvoiddoFilter(ServletRequestreq,ServletResponseres, <BR>FilterChainfChain)throwsIOException,ServletException{ <BR>HttpServletRequestrequest=(HttpServletRequest)req; <BR>HttpServletResponseresponse=(HttpServletResponse)res; <BR>HttpSessionsession=request.getSession(); <BR>StringuserId=(String)session.getAttribute("userid"); <BR>req.setCharacterEncoding(this.filterConfig.getInitParameter("charset"));//设置字符集？ <BR>实际上是设置了byte——〉char的encoding <BR>try{ <BR>if(userId==null||userId.equals("")){ <BR>if(!request.getRequestURL().toString().matches( <BR>".*/uirs/logon/logon(Controller){0,1}\\x2Ejsp$")){ <BR>session.invalidate(); <BR>response.sendRedirect(request.getContextPath()+ <BR>"/uirs/logon/logon.jsp"); <BR>} <BR>} <BR>else{//看看是否具有信息上报系统的权限 <BR>if(!net.golden.uirs.util.UirsChecker.check(userId,"信息上报系统", <BR>net.golden.uirs.util.UirsChecker.ACTION_DO)){ <BR>if(!request.getRequestURL().toString().matches( <BR>".*/uirs/logon/logon(Controller){0,1}\\x2Ejsp$")){ <BR>response.sendRedirect(request.getContextPath()+ <BR>"/uirs/logon/logonController.jsp"); <BR>} <BR>} <BR>} <BR>} <BR>catch(Exceptionex){ <BR>response.sendRedirect(request.getContextPath()+ <BR>"/uirs/logon/logon.jsp"); <BR>} <BR>fChain.doFilter(req,res); <BR>} </FONT></CODE></SPAN></I></I></I></I></I>]]></description>
</item><item>
<title><![CDATA[乱码问题（十一）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24074</link>
<author>krf301</author>
<pubDate>2007/4/16 22:23:52</pubDate>
<description><![CDATA[
<TABLE cellPadding=3 width="98%" border=0>
<TBODY>
<TR>
<TD align=middle width="100%">
<H3>Java中文转码的例子，用来对付乱码 </H3></TD></TR>
<TR bgColor=#f5f5f5 height=30>
<TD align=middle width="100%">&nbsp;</TD></TR>
<TR>
<TD width="100%"><BR><FONT class=calling id=uline style="LINE-HEIGHT: 180%"><FONT size=2>
<P><FONT face=Verdana>public class HelloWorld </FONT></P>
<P><FONT face=Verdana>{ </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp; public static void main(String[] argv){ </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp; try{ </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("中文");//1 </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("中文".getBytes());//2 </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("中文".getBytes("GB2312"));//3 </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("中文".getBytes("ISO8859_1"));//4 </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(new String("中文".getBytes()));//5 </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(new String("中文".getBytes(),"GB2312"));//6 </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(new String("中文".getBytes(),"ISO8859_1"));//7 </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(new String("中文".getBytes("GB2312")));//8 </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(new String("中文".getBytes("GB2312"),"GB2312"));//9 </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(new String("中文".getBytes("GB2312"),"ISO8859_1"));//10 </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(new String("中文".getBytes("ISO8859_1")));//11 </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(new String("中文".getBytes("ISO8859_1"),"GB2312"));//12 </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(new String("中文".getBytes("ISO8859_1"),"ISO8859_1"));//13 </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp; } </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e){ </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace(); </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp; } </FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp; } </FONT></P>
<P><FONT face=Verdana>} </FONT></P></FONT></FONT></TD></TR></TBODY></TABLE>]]></description>
</item><item>
<title><![CDATA[乱码问题（十）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24073</link>
<author>krf301</author>
<pubDate>2007/4/16 22:22:48</pubDate>
<description><![CDATA[
<H1 class=articletitle>JSP的参数传递的乱码解决</H1>
<P class="articleinfo smalltxt">&nbsp;</P>
<DIV id=articlebody><FONT size=2>本文解决了JSP的URL字符 encoding 问题：<BR><BR>如果通过 get/post 方式从 browser 返回的值中包含汉字信息， servlet 将无法得到正确的值。<BR><BR>解决方案<BR><BR><A href="http://www.kaixuela.com/?value=" target=_blank>http://www.kaixuela.com?value=</A>你好 <BR><BR>解决方案是用这种方案： <BR><BR>&lt;%@ page contentType="text/html;charset=gb2312" %&gt; <BR>&lt;html&gt; <BR>你好&lt;%=new String(request.getParameter("value").getBytes("8859_1"),"gb2312")%&gt; <BR>&lt;/html&gt; </FONT></DIV>]]></description>
</item><item>
<title><![CDATA[乱码问题（九）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24072</link>
<author>krf301</author>
<pubDate>2007/4/16 22:19:18</pubDate>
<description><![CDATA[
<TABLE class=tb cellSpacing=0 cellPadding=3 width="95%" align=center border=0>
<TBODY>
<TR>
<TD class=title>
<H1>深入剖析JSP和Servlet对中文的处理</H1></TD></TR>
<TR>
<TD>
<HR SIZE=1>

<SCRIPT type=text/javascript> 
var arrBaiduCproConfig=new Array(); 
arrBaiduCproConfig['uid'] =2214;
arrBaiduCproConfig['n'] ='sayyescpr';
arrBaiduCproConfig['tm'] ='25';
arrBaiduCproConfig['cm'] ='25';
arrBaiduCproConfig['um'] ='22';
arrBaiduCproConfig['w'] ='600';
arrBaiduCproConfig['h'] ='37';
arrBaiduCproConfig['wn'] ='3';
arrBaiduCproConfig['hn'] ='1';
arrBaiduCproConfig['ta'] ='right';
arrBaiduCproConfig['tl'] ='bottom';
arrBaiduCproConfig['bu'] ='0';
arrBaiduCproConfig['bd'] ='#trans';
arrBaiduCproConfig['bg'] ='#trans';
arrBaiduCproConfig['tt'] ='#0000ff';
arrBaiduCproConfig['ct'] ='#444444';
arrBaiduCproConfig['url'] ='#008000';
arrBaiduCproConfig['bdl'] ='#000000';
arrBaiduCproConfig['rad'] =1;
</SCRIPT>

<SCRIPT src="http://cpro.baidu.com/cpro/ui/ui.js" type=text/javascript charset=gbk> 
</SCRIPT>

<SCRIPT type=text/javascript> 
<!-- 
document.write(baiduCproIFrame()); 
--> 
</SCRIPT>
<SPAN class=t18>世界上的各地区都有本地的语言。地区差异直接导致了语言环境的差异。在开发一个国际化程序的过程中，处理语言问题就显得很重要了。
<P>　　这是一个世界范围内都存在的问题，所以，Java提供了世界性的解决方法。本文描述的方法是用于处理中文的，但是，推而广之，对于处理世界上其它国家和地区的语言同样适用。</P>
<P>　　汉字是双字节的。所谓双字节是指一个双字要占用两个BYTE的位置（即16位），分别称为高位和低位。中国规定的汉字编码为GB2312，这是强制性的，目前几乎所有的能处理中文的应用程序都支持GB2312。GB2312包括了一二级汉字和9区符号，高位从0xa1到0xfe，低位也是从0xa1到0xfe，其中，汉字的编码范围为0xb0a1到0xf7fe。</P>
<P>　　另外有一种编码，叫做GBK，但这是一份规范，不是强制的。GBK提供了20902个汉字，它兼容GB2312，编码范围为0x8140到0xfefe。GBK中的所有字符都可以一一映射到Unicode 2.0。</P>
<P>　　在不久的将来，中国会颁布另一种标准：GB18030-2000（GBK2K）。它收录了藏、蒙等少数民族的字型，从根本上解决了字位不足的问题。注意：它不再是定长的。其二字节部份与GBK兼容，四字节部分是扩充的字符、字形。它的首字节和第三字节从0x81到0xfe，二字节和第四字节从0x30到0x39。</P>
<P>　　本文不打算介绍Unicode，有兴趣的可以浏览“http://www.unicode.org/”查看更多的信息。Unicode有一个特性：它包括了世界上所有的字符字形。所以，各个地区的语言都可以建立与Unicode的映射关系，而Java正是利用了这一点以达到异种语言之间的转换。</P>
<P>　　在JDK中，与中文相关的编码有：</P>
<P>　　表1　JDK中与中文相关的编码列表<BR>
<TABLE cellSpacing=0 cellPadding=0 width="90%" align=center border=1>
<TBODY>
<TR>
<TD>编码名称</TD>
<TD>说明</TD></TR>
<TR>
<TD>ASCII</TD>
<TD>7位，与ascii7相同</TD></TR>
<TR>
<TD>ISO8859-1</TD>
<TD>8-位，与 8859_1,ISO-8859-1,ISO_8859-1,latin1...等相同</TD></TR>
<TR>
<TD>GB2312-80</TD>
<TD>16位，与gb2312,gb2312-1980,EUC_CN,euccn,1381,Cp1381, 1383, Cp1383, ISO2022CN,ISO2022CN_GB...等相同</TD></TR>
<TR>
<TD>GBK</TD>
<TD>与MS936相同，注意：区分大小写</TD></TR>
<TR>
<TD>UTF8</TD>
<TD>与UTF-8相同</TD></TR>
<TR>
<TD>GB18030</TD>
<TD>与cp1392、1392相同，目前支持的JDK很少</TD></TR></TBODY></TABLE></P>
<P>　　在实际编程时，接触得比较多的是GB2312（GBK）和ISO8859-1。</P>
<P>　　为什么会有“?”号</P>
<P>　　上文说过，异种语言之间的转换是通过Unicode来完成的。假设有两种不同的语言A和B，转换的步骤为：先把A转化为Unicode，再把Unicode转化为B。</P>
<P>　　举例说明。有GB2312中有一个汉字“李”，其编码为“C0EE”，欲转化为ISO8859-1编码。步骤为：先把“李”字转化为Unicode，得到“674E”，再把“674E”转化为ISO8859-1字符。当然，这个映射不会成功，因为ISO8859-1中根本就没有与“674E”对应的字符。</P>
<P>　　当映射不成功时，问题就发生了！当从某语言向Unicode转化时，如果在某语言中没有该字符，得到的将是Unicode的代码“\uffffd”（“\u”表示是Unicode编码，）。而从Unicode向某语言转化时，如果某语言没有对应的字符，则得到的是“0x3f”（“?”）。这就是“?”的由来。</P>
<P>　　例如：把字符流buf =“0x80 0x40 0xb0 0xa1”进行new String(buf, "gb2312")操作，得到的结果是“\ufffd\u554a”，再println出来，得到的结果将是“?啊”，因为“0x80 0x40”是GBK中的字符，在GB2312中没有。</P>
<P>　　再如，把字符串String="\u00d6\u00ec\u00e9\u0046\u00bb\u00f9"进行new String (buf.getBytes("GBK"))操作，得到的结果是“3fa8aca8a6463fa8b4”，其中，“\u00d6”在“GBK”中没有对应的字符，得到“3f”，“\u00ec”对应着“a8ac”，“\u00e9”对应着“a8a6”，“0046”对应着“46”（因为这是ASCII字符），“\u00bb”没找到，得到“3f”，最后，“\u00f9”对应着“a8b4”。把这个字符串println一下，得到的结果是“?ìéF?ù”。看到没？这里并不全是问号，因为GBK与Unicode映射的内容中除了汉字外还有字符，本例就是最好的明证。</P>
<P>　　所以，在汉字转码时，如果发生错乱，得到的不一定都是问号噢！不过，错了终究是错了，50步和100步并没有质的差别。</P>
<P>　　或者会问：如果源字符集中有，而Unicode中没有，结果会如何？回答是不知道。因为我手头没有能做这个测试的源字符集。但有一点是肯定的，那就是源字符集不够规范。在Java中，如果发生这种情况，是会抛出异常的。<BR><BR>　　什么是UTF</P>
<P>　　UTF，是Unicode Text Format的缩写，意为Unicode文本格式。对于UTF，是这样定义的：</P>
<P>　　（1）如果Unicode的16位字符的头9位是0，则用一个字节表示，这个字节的首位是“0”，剩下的7位与原字符中的后7位相同，如“\u0034”（0000 0000 0011 0100），用“34” (0011 0100)表示；（与源Unicode字符是相同的）；</P>
<P>　　（2）如果Unicode的16位字符的头5位是0，则用2个字节表示，首字节是“110”开头，后面的5位与源字符中除去头5个零后的最高5位相同；第二个字节以“10”开头，后面的6位与源字符中的低6位相同。如“\u025d”（0000 0010 0101 1101），转化后为“c99d”（1100 1001 1001 1101）；</P>
<P>　　（3）如果不符合上述两个规则，则用三个字节表示。第一个字节以“1110”开头，后四位为源字符的高四位；第二个字节以“10”开头，后六位为源字符中间的六位；第三个字节以“10”开头，后六位为源字符的低六位；如“\u9da7”（1001 1101 1010 0111），转化为“e9b6a7”（1110 1001 1011 0110 1010 0111）；</P>
<P>　　可以这么描述JAVA程序中Unicode与UTF的关系，虽然不绝对：字符串在内存中运行时，表现为Unicode代码，而当要保存到文件或其它介质中去时，用的是UTF。这个转化过程是由writeUTF和readUTF来完成的。</P>
<P>　　好了，基础性的论述差不多了，下面进入正题。</P>
<P>　　先把这个问题想成是一个黑匣子。先看黑匣子的一级表示：</P>
<P>input(charsetA)-&gt;process(Unicode)-&gt;output(charsetB)</P>
<P>　　简单，这就是一个IPO模型，即输入、处理和输出。同样的内容要经过“从charsetA到unicode再到charsetB”的转化。</P>
<P>　　再看二级表示：</P>
<P>SourceFile(jsp,java)-&gt;class-&gt;output</P>
<P>　　在这个图中，可以看出，输入的是jsp和java源文件，在处理过程中，以Class文件为载体，然后输出。再细化到三级表示：</P>
<P>jsp-&gt;temp file-&gt;class-&gt;browser,os console,db</P>
<P>app,servlet-&gt;class-&gt;browser,os console,db</P>
<P>　　这个图就更明白了。Jsp文件先生成中间的Java文件，再生成Class。而Servlet和普通App则直接编译生成Class。然后，从Class再输出到浏览器、控制台或<A href="http://www.knowsky.com/sql.asp" snap_preview_added="no"><FONT color=#000000>数据库</FONT></A>等。</P>
<P>　　JSP：从源文件到Class的过程</P>
<P>　　Jsp的源文件是以“.jsp”结尾的文本文件。在本节中，将阐述JSP文件的解释和编译过程，并跟踪其中的中文变化。</P>
<P>　　1、JSP/Servlet引擎提供的JSP转换工具（jspc）搜索JSP文件中用&lt;%@ page contentType ="text/html; charset=&lt;Jsp-charset&gt;"%&gt;中指定的charset。如果在JSP文件中未指定&lt;Jsp-charset&gt;，则取JVM中的默认设置file.encoding，一般情况下，这个值是ISO8859-1；</P>
<P>　　2、jspc用相当于“javac –encoding &lt;Jsp-charset&gt;”的命令解释JSP文件中出现的所有字符，包括中文字符和ASCII字符，然后把这些字符转换成Unicode字符，再转化成UTF格式，存为JAVA文件。ASCII码字符转化为Unicode字符时只是简单地在前面加“00”，如“A”，转化为“\u0041”（不需要理由，Unicode的码表就是这么编的）。然后，经过到UTF的转换，又变回“41”了！这也就是可以使用普通文本编辑器查看由JSP生成的JAVA文件的原因；</P>
<P>　　3、引擎用相当于“javac –encoding UNICODE”的命令，把JAVA文件编译成CLASS文件；</P>
<P>　　先看一下这些过程中中文字符的转换情况。有如下源代码：</P>
<P>&lt;%@ page contentType="text/html; charset=gb2312"%&gt;<BR>&lt;html&gt;&lt;body&gt;<BR>&lt;%<BR>　String a="中文";<BR>　out.println(a);<BR>%&gt;<BR>&lt;/body&gt;&lt;/html&gt; </P>
<P>　　这段代码是在UltraEdit for Windows上编写的。保存后，“中文”两个字的16进制编码为“D6 D0 CE C4”（GB2312编码）。经查表，“中文”两字的Unicode编码为“\u4E2D\u6587”，用 UTF表示就是“E4 B8 AD E6 96 87”。打开引擎生成的由JSP文件转变而成的JAVA文件，发现其中的“中文”两个字确实被“E4 B8 AD E6 96 87”替代了，再查看由JAVA文件编译生成的CLASS文件，发现结果与JAVA文件中的完全一样。</P>
<P>　　再看JSP中指定的CharSet为ISO-8859-1的情况。</P>
<P>&lt;%@ page contentType="text/html; charset=ISO-8859-1"%&gt;<BR>&lt;html&gt;&lt;body&gt;<BR>&lt;%<BR>　String a="中文";<BR>　out.println(a);<BR>%&gt;<BR>&lt;/body&gt;&lt;/html&gt; </P>
<P>　　同样，该文件是用UltraEdit编写的，“中文”这两个字也是存为GB2312编码“D6 D0 CE C4”。先模拟一下生成的JAVA文件和CLASS文件的过程：jspc用ISO-8859-1来解释“中文”，并把它映射到Unicode。由于ISO-8859-1是8位的，且是拉丁语系，其映射规则就是在每个字节前加“00”，所以，映射后的Unicode编码应为“\u00D6\u00D0\u00CE\u00C4”，转化成UTF后应该是“C3 96 C3 90 C3 8E C3 84”。好，打开文件看一下，JAVA文件和CLASS文件中，“中文”果然都表示为“C3 96 C3 90 C3 8E C3 84”。</P>
<P>　　如果上述代码中不指定&lt;Jsp-charset&gt;，即把第一行写成“&lt;%@ page contentType="text/html" %&gt;”，JSPC会使用file.encoding的设置来解释JSP文件。在RedHat 6.2上，其处理结果与指定为ISO-8859-1是完全相同的。</P>
<P>　　到现在为止，已经解释了从JSP文件到CLASS文件的转变过程中中文字符的映射过程。一句话：从“JspCharSet到Unicode再到UTF”。下表总结了这个过程：</P>
<P>　　表2　“中文”从JSP到CLASS的转化过程<BR>
<TABLE cellSpacing=0 cellPadding=0 width="90%" align=center border=1>
<TBODY>
<TR>
<TD>Jsp-CharSet</TD>
<TD>JSP文件中</TD>
<TD>JAVA文件中</TD>
<TD>CLASS文件中</TD></TR>
<TR>
<TD>GB2312</TD>
<TD>D6 D0 CE C4(GB2312)</TD>
<TD>从\u4E2D\u6587(Unicode)到E4 B8 AD E6 96 87 (UTF)</TD>
<TD>E4 B8 AD E6 96 87 (UTF)</TD></TR>
<TR>
<TD>ISO-8859-1</TD>
<TD>D6 D0 CE C4<BR>(GB2312)</TD>
<TD>从\u00D6\u00D0\u00CE\u00C4 (Unicode)到C3 96 C3 90 C3 8E C3 84 (UTF)</TD>
<TD>C3 96 C3 90 C3 8E C3 84 (UTF)</TD></TR>
<TR>
<TD>无（默认＝file.encoding）</TD>
<TD>同ISO-8859-1</TD>
<TD>同ISO-8859-1</TD>
<TD>同ISO-8859-1</TD></TR></TBODY></TABLE><BR>　　下节先讨论Servlet从JAVA文件到CLASS文件的转化过程，然后再解释从CLASS文件如何输出到客户端。之所以这样安排，是因为JSP和Servlet在输出时处理方法是一样的。</P>
<P>　　Servlet：从源文件到Class的过程</P>
<P>　　Servlet源文件是以“.java”结尾的文本文件。本节将讨论Servlet的编译过程并跟踪其中的中文变化。</P>
<P>　　用“javac”编译Servlet源文件。javac可以带“-encoding &lt;Compile-charset&gt;”参数，意思是“用&lt; Compile-charset &gt;中指定的编码来解释Serlvet源文件”。</P>
<P>　　源文件在编译时，用&lt;Compile-charset&gt;来解释所有字符，包括中文字符和ASCII字符。然后把字符常量转变成Unicode字符，最后，把Unicode转变成UTF。</P>
<P>　　在Servlet中，还有一个地方设置输出流的CharSet。通常在输出结果前，调用HttpServletResponse的setContentType方法来达到与在JSP中设置&lt;Jsp-charset&gt;一样的效果，称之为&lt;Servlet-charset&gt;。</P>
<P>　　注意，文中一共提到了三个变量：&lt;Jsp-charset&gt;、&lt;Compile-charset&gt;和&lt;Servlet-charset&gt;。其中，JSP文件只与&lt;Jsp-charset&gt;有关，而&lt;Compile-charset&gt;和&lt;Servlet-charset&gt;只与Servlet有关。</P>
<P>　　看下例：</P>
<P>import javax.servlet.*;</P>
<P>import javax.servlet.http.*;</P>
<P>class testServlet extends HttpServlet<BR>{<BR>　public void doGet(HttpServletRequest req,HttpServletResponse resp)<BR>　throws ServletException,java.io.IOException<BR>　{<BR>　　resp.setContentType("text/html; charset=GB2312");<BR>　　java.io.PrintWriter out=resp.getWriter();<BR>　　out.println("&lt;html&gt;");<BR>　　out.println("#中文#");<BR>　　out.println("&lt;/html&gt;");<BR>　}<BR>} </P>
<P>　　该文件也是用UltraEdit for Windows编写的，其中的“中文”两个字保存为“D6 D0 CE C4”（GB2312编码）。</P>
<P>　　开始编译。下表是&lt;Compile-charset&gt;不同时，CLASS文件中“中文”两字的十六进制码。在编译过程中，&lt;Servlet-charset&gt;不起任何作用。&lt;Servlet-charset&gt;只对CLASS文件的输出产生影响，实际上是&lt;Servlet-charset&gt;和&lt;Compile-charset&gt;一起，达到与JSP文件中的&lt;Jsp-charset&gt;相同的效果，因为&lt;Jsp-charset&gt;对编译和CLASS文件的输出都会产生影响。</P>
<P>　　表3　“中文”从Servlet源文件到Class的转变过程<BR>
<TABLE cellSpacing=0 cellPadding=0 width="90%" align=center border=1>
<TBODY>
<TR>
<TD>Compile-charset</TD>
<TD>Servlet源文件中</TD>
<TD>Class文件中</TD>
<TD>等效的Unicode码</TD></TR>
<TR>
<TD>GB2312</TD>
<TD>D6 D0 CE C4 <BR>(GB2312)</TD>
<TD>E4 B8 AD E6 96 87 (UTF)</TD>
<TD>\u4E2D\u6587 (在Unicode中＝“中文”)</TD></TR>
<TR>
<TD>ISO-8859-1</TD>
<TD>D6 D0 CE C4 <BR>(GB2312)</TD>
<TD>C3 96 C3 90 C3 8E C3 84 (UTF)</TD>
<TD>\u00D6 \u00D0 \u00CE \u00C4 (在D6 D0 CE C4前面各加了一个00)</TD></TR>
<TR>
<TD>无（默认）</TD>
<TD>D6 D0 CE C4 (GB2312)</TD>
<TD>同ISO-8859-1</TD>
<TD>同ISO-8859-1</TD></TR></TBODY></TABLE><BR>　　普通Java程序的编译过程与Servlet完全一样。<BR><BR>　　CLASS文件中的中文表示法是不是昭然若揭了？OK，接下来看看CLASS又是怎样输出中文的呢？<BR><BR>　　Class：输出字符串<BR><BR>　　上文说过，字符串在内存中表现为Unicode编码。至于这种Unicode编码表示了什么，那要看它是从哪种字符集映射过来的，也就是说要看它的祖先。这好比在托运行李时，外观都是纸箱子，里面装了什么就要看寄邮件的人实际邮了什么东西。<BR><BR>　　看看上面的例子，如果给一串Unicode编码“00D6 00D0 00CE 00C4”，如果不作转换，直接用Unicode码表来对照它时，是四个字符（而且是特殊字符）；假如把它与“ISO8859-1”进行映射，则直接去掉前面的“00”即可得到“D6 D0 CE C4”，这是ASCII码表中的四个字符；而假如把它当作GB2312来进行映射，得到的结果很可能是一大堆乱码，因为在GB2312中有可能没有（也有可能有）字符与00D6等字符对应（如果对应不上，将得到0x3f，也就是问号，如果对应上了，由于00D6等字符太靠前，估计也是一些特殊符号，真正的汉字在Unicode中的编码从4E00开始）。<BR><BR>　　各位看到了，同样的Unicode字符，可以解释成不同的样子。当然，这其中有一种是我们期望的结果。以上例而论，“D6 D0 CE C4”应该是我们所想要的，当把“D6 D0 CE C4”输出到IE中时，用“简体中文”方式查看，就能看到清楚的“中文”两个字了。（当然了，如果你一定要用“西欧字符”来看，那也没办法，你将得不到任何有何时何地的东西）为什么呢？因为“00D6 00D0 00CE 00C4”本来就是由ISO8859-1转化过去的。<BR><SPAN class=f14><FONT size=3>　　给出如下结论：<BR><BR>　　在Class输出字符串前，会将Unicode的字符串按照某一种内码重新生成字节流，然后把字节流输入，相当于进行了一步“String.getBytes(???)”操作。???代表某一种字符集。<BR><BR>　　如果是Servlet，那么，这种内码就是在HttpServletResponse.setContentType()方法中指定的内码，也就是上文定义的＜Servlet-charset＞。<BR><BR>　　如果是JSP，那么，这种内码就是在＜%@ page contentType=""%＞中指定的内码，也就是上文定义的＜Jsp-charset＞。<BR><BR>　　如果是Java程序，那么，这种内码就是file.encoding中指定的内码，默认为ISO8859-1。<BR><BR>　　当输出对象是浏览器时<BR><BR>　　以流行的浏览器IE为例。IE支持多种内码。假如IE接收到了一个字节流“D6 D0 CE C4”，你可以尝试用各种内码去查看。你会发现用“简体中文”时能得到正确的结果。因为“D6 D0 CE C4”本来就是简体中文中“中文”两个字的编码。<BR><BR>　　OK，完整地看一遍。<BR><BR>　　JSP：源文件为GB2312格式的文本文件，且JSP源文件中有“中文”这两个汉字<BR><BR>　　如果指定了＜Jsp-charset＞为GB2312，转化过程如下表。<BR><BR>　　表4　Jsp-charset = GB2312时的变化过程<BR><BR></FONT>
<TABLE cellSpacing=0 cellPadding=0 width="90%" align=center border=1>
<TBODY>
<TR>
<TD width="8%">序号</TD>
<TD width="65%">步骤说明</TD>
<TD width="27%">结果</TD></TR>
<TR>
<TD>1</TD>
<TD>编写JSP源文件，且存为GB2312格式</TD>
<TD>D6 D0 CE C4<BR>（D6D0=中 CEC4=文）</TD></TR>
<TR>
<TD>2</TD>
<TD>jspc把JSP源文件转化为临时JAVA文件，并把字符串按照GB2312映射到Unicode，并用UTF格式写入JAVA文件中</TD>
<TD>E4 B8 AD E6 96 87</TD></TR>
<TR>
<TD>3</TD>
<TD>把临时JAVA文件编译成CLASS文件</TD>
<TD>E4 B8 AD E6 96 87</TD></TR>
<TR>
<TD>4</TD>
<TD>运行时，先从CLASS文件中用readUTF读出字符串，在内存中的是Unicode编码</TD>
<TD>4E 2D 65 87（在Unicode中4E2D=中 6587=文）</TD></TR>
<TR>
<TD>5</TD>
<TD>根据Jsp-charset=GB2312把Unicode转化为字节流</TD>
<TD>D6 D0 CE C4</TD></TR>
<TR>
<TD>6</TD>
<TD>把字节流输出到IE中，并设置IE的编码为GB2312（作者按：这个信息隐藏在HTTP头中）</TD>
<TD>D6 D0 CE C4</TD></TR>
<TR>
<TD>7</TD>
<TD>IE用“简体中文”查看结果</TD>
<TD>“中文”（正确显示）</TD></TR></TBODY></TABLE><BR>　　如果指定了＜Jsp-charset＞为ISO8859-1，转化过程如下表。<BR><BR>　　表5　Jsp-charset = ISO8859-1时的变化过程<BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width="90%" align=center border=1>
<TBODY>
<TR>
<TD width="7%">序号</TD>
<TD width="66%">步骤说明</TD>
<TD width="27%">结果</TD></TR>
<TR>
<TD>1</TD>
<TD>编写JSP源文件，且存为GB2312格式</TD>
<TD>D6 D0 CE C4<BR>（D6D0=中 CEC4=文）</TD></TR>
<TR>
<TD>2</TD>
<TD>jspc把JSP源文件转化为临时JAVA文件，并把字符串按照ISO8859-1映射到Unicode，并用UTF格式写入JAVA文件中</TD>
<TD>C3 96 C3 90 C3 8E C3 84</TD></TR>
<TR>
<TD>3</TD>
<TD>把临时JAVA文件编译成CLASS文件</TD>
<TD>C3 96 C3 90 C3 8E C3 84</TD></TR>
<TR>
<TD>4</TD>
<TD>运行时，先从CLASS文件中用readUTF读出字符串，在内存中的是Unicode编码</TD>
<TD>00 D6 00 D0 00 CE 00 C4<BR>（啥都不是！！！）</TD></TR>
<TR>
<TD>5</TD>
<TD>根据Jsp-charset=ISO8859-1把Unicode转化为字节流</TD>
<TD>D6 D0 CE C4</TD></TR>
<TR>
<TD>6</TD>
<TD>把字节流输出到IE中，并设置IE的编码为ISO8859-1（作者按：这个信息隐藏在HTTP头中）</TD>
<TD>D6 D0 CE C4</TD></TR>
<TR>
<TD>7</TD>
<TD>IE用“西欧字符”查看结果</TD>
<TD>乱码，其实是四个ASCII字符，但由于大于128，所以显示出来的怪模怪样</TD></TR>
<TR>
<TD>8</TD>
<TD>改变IE的页面编码为“简体中文”</TD>
<TD>“中文”（正确显示）</TD></TR></TBODY></TABLE><BR>　　奇怪了！为什么把＜Jsp-charset＞设成GB2312和ISO8859-1是一个样的，都能正确显示？因为表4表5中的第2步和第5步互逆，是相互“抵消”的。只不过当指定为ISO8859-1时，要增加第8步操作，殊为不便。<BR><BR>　　再看看不指定＜Jsp-charset＞ 时的情况。<BR><BR>　　表6　未指定Jsp-charset 时的变化过程<BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width="90%" align=center border=1>
<TBODY>
<TR>
<TD width="6%">序号</TD>
<TD width="70%">步骤说明</TD>
<TD width="24%">结果</TD></TR>
<TR>
<TD>1</TD>
<TD>编写JSP源文件，且存为GB2312格式</TD>
<TD>D6 D0 CE C4<BR>（D6D0=中 CEC4=文）</TD></TR>
<TR>
<TD>2</TD>
<TD>jspc把JSP源文件转化为临时JAVA文件，并把字符串按照ISO8859-1映射到Unicode，并用UTF格式写入JAVA文件中</TD>
<TD>C3 96 C3 90 C3 8E C3 84</TD></TR>
<TR>
<TD>3</TD>
<TD>把临时JAVA文件编译成CLASS文件</TD>
<TD>C3 96 C3 90 C3 8E C3 84</TD></TR>
<TR>
<TD>4</TD>
<TD>运行时，先从CLASS文件中用readUTF读出字符串，在内存中的是Unicode编码</TD>
<TD>00 D6 00 D0 00 CE 00 C4</TD></TR>
<TR>
<TD>5</TD>
<TD>根据Jsp-charset=ISO8859-1把Unicode转化为字节流</TD>
<TD>D6 D0 CE C4</TD></TR>
<TR>
<TD>6</TD>
<TD>把字节流输出到IE中</TD>
<TD>D6 D0 CE C4</TD></TR>
<TR>
<TD>7</TD>
<TD>IE用发出请求时的页面的编码查看结果</TD>
<TD>视情况而定。如果是简体中文，则能正确显示，否则，需执行表5中的第8步</TD></TR></TBODY></TABLE><BR>　　Servlet：源文件为JAVA文件，格式是GB2312，源文件中含有“中文”这两个汉字<BR><BR>　　如果＜Compile-charset＞＝GB2312，＜Servlet-charset＞=GB2312<BR><BR>　　表7　Compile-charset=Servlet-charset=GB2312 时的变化过程<BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width="90%" align=center border=1>
<TBODY>
<TR>
<TD>序号</TD>
<TD>步骤说明</TD>
<TD>结果</TD></TR>
<TR>
<TD>1</TD>
<TD>编写Servlet源文件，且存为GB2312格式</TD>
<TD>D6 D0 CE C4<BR>（D6D0=中 CEC4=文）</TD></TR>
<TR>
<TD>2</TD>
<TD>用javac –encoding GB2312把JAVA源文件编译成CLASS文件</TD>
<TD>E4 B8 AD E6 96 87　（UTF）</TD></TR>
<TR>
<TD>3</TD>
<TD>运行时，先从CLASS文件中用readUTF读出字符串，在内存中的是Unicode编码</TD>
<TD>4E 2D 65 87 (Unicode)</TD></TR>
<TR>
<TD>4</TD>
<TD>根据Servlet-charset=GB2312把Unicode转化为字节流</TD>
<TD>D6 D0 CE C4 (GB2312)</TD></TR>
<TR>
<TD>5</TD>
<TD>把字节流输出到IE中并设置IE的编码属性为Servlet-charset=GB2312</TD>
<TD>D6 D0 CE C4 (GB2312)</TD></TR>
<TR>
<TD>6</TD>
<TD>IE用“简体中文”查看结果</TD>
<TD>“中文”（正确显示）</TD></TR></TBODY></TABLE><BR>　　如果＜Compile-charset＞＝ISO8859-1，＜Servlet-charset＞=ISO8859-1<BR><BR>　　表8　Compile-charset=Servlet-charset=ISO8859-1时的变化过程<BR><BR>
<TABLE cellSpacing=0 width="90%" align=center border=1>
<TBODY>
<TR>
<TD>序号</TD>
<TD>步骤说明</TD>
<TD>结果</TD></TR>
<TR>
<TD>1</TD>
<TD>编写Servlet源文件，且存为GB2312格式</TD>
<TD>D6 D0 CE C4<BR>（D6D0=中 CEC4=文）</TD></TR>
<TR>
<TD>2</TD>
<TD>用javac –encoding ISO8859-1把JAVA源文件编译成CLASS文件</TD>
<TD>C3 96 C3 90 C3 8E C3 84　（UTF）</TD></TR>
<TR>
<TD>3</TD>
<TD>运行时，先从CLASS文件中用readUTF读出字符串，在内存中的是Unicode编码</TD>
<TD>00 D6 00 D0 00 CE 00 C4</TD></TR>
<TR>
<TD>4</TD>
<TD>根据Servlet-charset=ISO8859-1把Unicode转化为字节流</TD>
<TD>D6 D0 CE C4</TD></TR>
<TR>
<TD>5</TD>
<TD>把字节流输出到IE中并设置IE的编码属性为Servlet-charset=ISO8859-1</TD>
<TD>D6 D0 CE C4 (GB2312)</TD></TR>
<TR>
<TD>6</TD>
<TD>IE用“西欧字符”查看结果</TD>
<TD>乱码（原因同表5）</TD></TR>
<TR>
<TD>7</TD>
<TD>改变IE的页面编码为“简体中文”</TD>
<TD>“中文”（正确显示）</TD></TR></TBODY></TABLE><BR>　　如果不指定Compile-charset或Servlet-charset，其默认值均为ISO8859-1。<BR><BR>　　当Compile-charset=Servlet-charset时，第2步和第4步能互逆，“抵消”，显示结果均能正确。读者可试着写一下Compile-charset＜＞Servlet-charset时的情况，肯定是不正确的。<BR><BR>　　当输出对象是数据库时<BR><BR>　　输出到数据库时，原理与输出到浏览器也是一样的。本节只是Servlet为例，JSP的情况请读者自行推导。<BR><BR>　　假设有一个Servlet，它能接收来自客户端（IE，简体中文）的汉字字符串，然后把它写入到内码为ISO8859-1的数据库中，然后再从数据库中取出这个字符串，显示到客户端。<BR><BR>　　表9　输出对象是数据库时的变化过程（1）<BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width="90%" align=center border=1>
<TBODY>
<TR>
<TD width="6%">序号</TD>
<TD width="62%">步骤说明</TD>
<TD width="25%">结果</TD>
<TD width="7%">域</TD></TR>
<TR>
<TD>1</TD>
<TD>在IE中输入“中文”</TD>
<TD>D6 D0 CE C4</TD>
<TD rowSpan=2>IE</TD></TR>
<TR>
<TD>2</TD>
<TD>IE把字符串转变成UTF，并送入传输流中</TD>
<TD>E4 B8 AD E6 96 87</TD></TR>
<TR>
<TD>3</TD>
<TD>Servlet接收到输入流，用readUTF读取</TD>
<TD>4E 2D 65 87(unicode)</TD>
<TD rowSpan=4>Servlet</TD></TR>
<TR>
<TD>4</TD>
<TD>编程者在Servlet中必须把字符串根据GB2312还原为字节流</TD>
<TD>D6 D0 CE C4</TD></TR>
<TR>
<TD>5</TD>
<TD>编程者根据数据库内码ISO8859-1生成新的字符串</TD>
<TD>00 D6 00 D0 00 CE 00 C4</TD></TR>
<TR>
<TD>6</TD>
<TD>把新生成的字符串提交给JDBC</TD>
<TD>00 D6 00 D0 00 CE 00 C4</TD></TR>
<TR>
<TD>7</TD>
<TD>JDBC检测到数据库内码为ISO8859-1</TD>
<TD>00 D6 00 D0 00 CE 00 C4</TD>
<TD rowSpan=4>JDBC</TD></TR>
<TR>
<TD>8</TD>
<TD>JDBC把接收到的字符串按照ISO8859-1生成字节流</TD>
<TD>D6 D0 CE C4</TD></TR>
<TR>
<TD>9</TD>
<TD>JDBC把字节流写入数据库中</TD>
<TD>D6 D0 CE C4</TD></TR>
<TR>
<TD>10</TD>
<TD>完成数据存储工作</TD>
<TD>D6 D0 CE C4 数据库</TD></TR>
<TR>
<TD colSpan=4>
<DIV align=center>以下是从数据库中取出数的过程</DIV></TD></TR>
<TR>
<TD>11</TD>
<TD>JDBC从数据库中取出字节流</TD>
<TD>D6 D0 CE C4</TD>
<TD>JDBC</TD></TR>
<TR>
<TD>12</TD>
<TD>JDBC按照数据库的字符集ISO8859-1生成字符串，并提交给Servlet</TD>
<TD>00 D6 00 D0 00 CE 00 C4 (Unicode)</TD>
<TD>&nbsp;</TD></TR>
<TR>
<TD>13</TD>
<TD>Servlet获得字符串</TD>
<TD>00 D6 00 D0 00 CE 00 C4 (Unicode)</TD>
<TD>Servlet</TD></TR>
<TR>
<TD>14</TD>
<TD>编程者必须根据数据库的内码ISO8859-1还原成原始字节流</TD>
<TD>D6 D0 CE C4</TD>
<TD>&nbsp;</TD></TR>
<TR>
<TD>15</TD>
<TD>编程者必须根据客户端字符集GB2312生成新的字符串</TD>
<TD>4E 2D 65 87<BR>（Unicode）</TD>
<TD>&nbsp;</TD></TR>
<TR>
<TD colSpan=4>
<DIV align=center>Servlet准备把字符串输出到客户端</DIV></TD></TR>
<TR>
<TD>16</TD>
<TD>Servlet根据＜Servlet-charset＞生成字节流</TD>
<TD>D6D0 CE C4</TD>
<TD rowSpan=2>Servlet</TD></TR>
<TR>
<TD>17</TD>
<TD>Servlet把字节流输出到IE中，如果已指定＜Servlet-charset＞，还会设置IE的编码为＜Servlet-charset＞</TD>
<TD>D6 D0 CE C4</TD></TR>
<TR>
<TD>18</TD>
<TD>IE根据指定的编码或默认编码查看结果</TD>
<TD>“中文”（正确显示）</TD>
<TD>IE</TD></TR></TBODY></TABLE><BR>　　解释一下，表中第4第5步和第15第16步是用红色标记的，表示要由编码者来作转换。第4、5两步其实就是一句话：“new String(source.getBytes("GB2312"), "ISO8859-1")”。第15、16两步也是一句话：“new String(source.getBytes("ISO8859-1"), "GB2312")”。亲爱的读者，你在这样编写代码时是否意识到了其中的每一个细节呢？<BR><BR>　　至于客户端内码和数据库内码为其它值时的流程，和输出对象是系统控制台时的流程，请读者自己想吧。明白了上述流程的原理，相信你可以轻松地写出来。<BR><BR>　　行文至此，已可告一段落了。终点又回到了起点，对于编程者而言，几乎是什么影响都没有。<BR><BR>　　因为我们早就被告之要这么做了。<BR><BR>　　以下给出一个结论，作为结尾。<BR><BR>　　1、 在Jsp文件中，要指定contentType，其中，charset的值要与客户端浏览器所用的字符集一样；对于其中的字符串常量，不需做任何内码转换；对于字符串变量，要求能根据ContentType中指定的字符集还原成客户端能识别的字节流，简单地说，就是“字符串变量是基于＜Jsp-charset＞字符集的”；<BR><BR>　　2、 在Servlet中，必须用HttpServletResponse.setContentType()设置charset，且设置成与客户端内码一致；对于其中的字符串常量，需要在Javac编译时指定encoding，这个encoding必须与编写源文件的平台的字符集一样，一般说来都是GB2312或GBK；对于字符串变量，与JSP一样，必须“是基于＜Servlet-charset＞字符集的”。</SPAN></P></SPAN></TD></TR></TBODY></TABLE>]]></description>
</item><item>
<title><![CDATA[乱码问题（八）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24071</link>
<author>krf301</author>
<pubDate>2007/4/16 22:16:52</pubDate>
<description><![CDATA[
<H2 class=diaryTitle>关于JAVA乱码！- -</H2>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<P>
<P>=====乱码情况1：与jsp相关<BR>现象：通过param = new String(param.getBytes("iso8859-1"), "gb2312");//对bytes[]内容按指定进行转码<BR>&gt;&gt;&gt;解决方法<BR>1、加在jsp文件前面<BR>&lt;%@ page contentType="text/html;charset=gb2312" language="java"%&gt;//只是指定显示的编码，不转码<BR>&lt;META http-equiv=Content-Type content="text/html; charset=gb2312"&gt;//只是指定显示的编码，不转码<BR>2、也加在jsp文件前面<BR>&lt;<A href="mailto:%@page">%@page</A> pageEncoding="GB2312"%&gt;//指定*.jsp的编译时的编码方式。<BR>&lt;%&nbsp;request.setCharacterEncoding("gb2312");%&gt;//对bytes[]内容按指定进行转码<BR>3、在web.xml里面可以有filter(代码见附录)，作用与上一点是一样的，只是不需要每一个jsp都去写那句代码。<BR>4、可能在tomcat4.1.24以后的版本中，如果不是在from中post出去的中文字符，都会有问题！</P>
<P>=====乱码情况2：与URL相关<BR><A href="http://127.0.0.1/encode/a.jsp?param">http://127.0.0.1/encode/a.jsp?param</A>=我爱小宝<BR>现象：通过param = new String(param.getBytes("iso8859-1"), "gb2312");好像不可以转换这种乱码<BR>是通过httpclient而后成了乱码，在tcp流里面是经过编码的，但转不成功<BR>&gt;&gt;&gt;解决方法<BR>import java.net.URLEncoder;<BR>import java.net.URLDecoder;<BR>sourcePath = URLEncoder.encode(sourcePath);<BR>this.sourcePath = URLDecoder.decode(sourcePath);//如果过来的是未encode的字符，不会出错，只是不decode</P>
<P>====其它<BR>1、使得Java语言拥有16位的Java字符，而却只有8位的输入设备，这样就给Java带来了些不足<BR>2、各种编码方式在转换时像GBK&lt;--&gt;Unicode/iso8859-1&lt;--&gt;Unicode之间是涵盖关系，不会丢失信息。<BR>3、提问：GB2312被 Unicode涵盖，那为什么不可以都用UTF-8，只在显示的时候转成GB12312???<BR>4、WEB容器在其内部默认的字符编码格式都是以ISO-8859-1为默认值的<BR>5、浏览器在传递参数时都是默认以UTF-8的方式来传递参数的<BR>6、只要入口和出口保证是GB2312，就可以了，其内容可能会在iso8859-1/Unicode之间转换。<BR>&nbsp;a、指定-encoding 2312对*.java文件进行编译 <BR>&nbsp;b、输出时指定编码：charset=gb2312<BR>&nbsp;c、接受URL参数时指定编码：request.setCharacterEncoding("gb2312");<BR>&nbsp;d、保证系统default encoding是GBK<BR>&nbsp;e、把数据库默认支持的编码格式改为GBK或GB2312的。(如果不设，jdbc缺省以iso8859-1来存信息)<BR>&nbsp;f、在*.java文件中采用字符流来处理带中文的字符串<BR>&nbsp;g、指定我们的JSP源文件的编码格式：&lt;<A href="mailto:%@page">%@page</A> pageEncoding="GB2312"%&gt;</P>
<P>====相关链接<BR>深入Java中文问题及最优解决方法--上：<A href="http://www.pconline.com.cn/pcedu/empolder/gj/java/0404/366404.html">http://www.pconline.com.cn/pcedu/empolder/gj/java/0404/366404.html</A><BR>深入Java中文问题及最优解决方法-下：<A href="http://www.pconline.com.cn/pcedu/empolder/gj/java/0405/368760.html">http://www.pconline.com.cn/pcedu/empolder/gj/java/0405/368760.html</A><BR>JAVA字符编码：<A href="http://www.weiw.com/article/list.asp?id=741">http://www.weiw.com/article/list.asp?id=741</A><BR>JSP/Servlet 中的汉字编码问题【转载】＋【原创】：<A href="http://www.weiw.com/article/list.asp?id=741">http://www.weiw.com/article/list.asp?id=741</A>(中文转码时'?'、乱码的由来)</P>
<P>====附录<BR>1、java类代码，编译后的class在CLASSPATH中能指定<BR>package aaa;<BR>import java.io.IOException;<BR>import javax.servlet.Filter;<BR>import javax.servlet.FilterChain;<BR>import javax.servlet.FilterConfig;<BR>import javax.servlet.ServletException;<BR>import javax.servlet.ServletRequest;<BR>import javax.servlet.ServletResponse;<BR>import javax.servlet.UnavailableException;</P>
<P>public class EncodingFilter implements Filter {<BR>&nbsp;&nbsp;&nbsp; protected String encoding = null;<BR>&nbsp;&nbsp;&nbsp; protected FilterConfig filterConfig = null;<BR>&nbsp;&nbsp;&nbsp; public void destroy() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.encoding = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.filterConfig = null;</P>
<P>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)<BR>&nbsp;&nbsp;throws IOException, ServletException {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Select and set (if needed) the character encoding to be used<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String encoding = selectEncoding(request);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (encoding != null)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setCharacterEncoding(encoding);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;// Pass control on to the next filter<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chain.doFilter(request, response);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; public void init(FilterConfig filterConfig) throws ServletException {<BR>&nbsp;&nbsp;this.filterConfig = filterConfig;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.encoding = filterConfig.getInitParameter("encoding");<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; protected String selectEncoding(ServletRequest request) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (this.encoding);<BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR>同时，在web.xml中加入如下配置：<BR>[code]<BR>&nbsp;&nbsp;&nbsp; &lt;filter&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;aaa.EncodingFilter&lt;/filter-class&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;encoding&lt;/param-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;GBK&lt;/param-value&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/filter&gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/filter-mapping&gt;<BR>[/code]</P>]]></description>
</item><item>
<title><![CDATA[乱码问题（七）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24070</link>
<author>krf301</author>
<pubDate>2007/4/16 22:10:33</pubDate>
<description><![CDATA[
<DIV class=entity>
<H2 class=diaryTitle>按照jsp规范防止乱码</H2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<P>
<P>举个例子: <BR>
<TABLE class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
<TBODY>
<TR>
<TD vAlign=top align=left width=1 bgColor=#dddddd><PRE><FONT color=#555555>1<BR>2<BR></FONT></PRE></TD>
<TD vAlign=top align=left bgColor=#ffffff><PRE>&lt;%@ page contentType=<FONT class=java-string>"text/html;charset=utf-8"</FONT> %&gt;
你好吗？
</PRE></TD></TR></TBODY></TABLE></P>
<P><BR><BR>resin等服务器大都会打印出乱码（tomcat除外），但是如果更改为 <BR></P>
<TABLE class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
<TBODY>
<TR>
<TD vAlign=top align=left width=1 bgColor=#dddddd><PRE><FONT color=#555555>1<BR>2<BR></FONT></PRE></TD>
<TD vAlign=top align=left bgColor=#ffffff><PRE>&lt;%@ page contentType=<FONT class=java-string>"text/html;charset=utf-8"</FONT> pageEncoding=<FONT class=java-string>"GBK"</FONT>%&gt;
你好吗？
</PRE></TD></TR></TBODY></TABLE>
<P><BR><BR>这样就服务器一定会是正确抓到“你好吗”了。 </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">关于</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> contentType </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">和</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> pageEncoding </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的差异</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">和</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">中文</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">JSP</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">页的设定技巧</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">: </SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"><BR><BR><SPAN class=javascript><B>contentType -- </B></SPAN></SPAN><SPAN class=javascript><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">指定的是</SPAN></B></SPAN><SPAN class=javascript><B><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">JSP</SPAN></B></SPAN><SPAN class=javascript><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">页最终</SPAN></B></SPAN><SPAN class=javascript><B><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> Browser(</SPAN></B></SPAN><SPAN class=javascript><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">客户端</SPAN></B></SPAN><SPAN class=javascript><B><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">)</SPAN></B></SPAN><SPAN class=javascript><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">所见到的网页内容的编码</SPAN></B></SPAN><SPAN class=javascript><B><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">.</SPAN></B></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> </SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"><BR></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">就是</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> Mozilla</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> Character encoding, </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">或者是</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> IE6</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> encoding. </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">例如</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> JSPtw Forum </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">用的</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">contentType</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">就是</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> Big5. </SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"><BR><BR><SPAN class=javascript><B>pageEncoding -- </B></SPAN></SPAN><SPAN class=javascript><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">指定</SPAN></B></SPAN><SPAN class=javascript><B><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">JSP</SPAN></B></SPAN><SPAN class=javascript><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">编写时所用的编码</SPAN></B></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> </SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"><BR></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">如果你的是</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">WIN98, </SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">或</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> ME </SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">的</SPAN></SPAN></SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">NOTEPAD</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">记事本编写</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">JSP, </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">就一定是常用的是</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">Big5 </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">或</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> gb2312, </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">如果是用</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> WIN2k winXP</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">NOTEPAD</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">时</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">, SAVE</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">时就可以选择不同的编</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">,</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">码</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">, </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">包括</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> ANSI(BIG5/GB2312)</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">或</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> UTF-8 </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">或</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> UNIONCODE(</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">估是</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> UCS 16). </SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"><BR><BR></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">因为</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> JSP</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">要经过</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">两次的</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">"</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">编码</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">", </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">第一阶段会用</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> pageEncoding, </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">第二阶段会用</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> utf-8 </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">至</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">utf-8, </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">第三阶段就是由</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">TOMCAT</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">出来的网页</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">, </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">用的是</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">contentType. </SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"><BR><BR></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">阶段一是</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> JSPC</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> JSP</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">至</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">JAVA(.java)</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">原码的</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">"</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">翻译</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">", </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">它会跟据</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> pageEncoding </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的设定读取</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">JSP. </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">结果是</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">由指定的</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> pageEncoding(utf-8,Big5,gb2312)</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">JSP </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">翻译成统一的</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">utf-8 JAVA</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">原码</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">(.java). </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">如果</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">pageEncoding</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">设定错了</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">, </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">或没设定</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">(</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">预设</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> ISO8859-1), </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">出来的</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">在这个阶段</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">就已是中文乱码</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">. </SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"><BR><BR></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">阶段二是由</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> JAVAC</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">JAVA</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">原码至</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">JAVA BYTECODE</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的编译</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">. </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">不论</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">JSP</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的编写时是用</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">(utf-8,Big5,gb2312),</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">经过阶段一的结果全都是</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">utf-8</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">ENCODING</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">JAVA</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">原码</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">. </SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"><BR><SPAN class=javascript>JAVAC</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">用</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> utf-8</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">ENCODING</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">读取</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">AVA</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">原码</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">, </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">编译成字符串是</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> utf-8 ENCODING</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的二进制码</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">(.class). </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">这是</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> JAVA VIRTUAL MACNHINE </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">对常数字符串在</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">二进制码</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">(JAVA BYTECODE)</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">内表逹的规范</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">. </SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"><BR><BR></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">阶段三是</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">TOMCAT(</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">或其的</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">application container)</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">加载和执行</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">阶段二得来的</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">JAVA</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">二进制码</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">, </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">输出的结果</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">( </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">也就是</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">BROWSER(</SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">客户端</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">)) </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">见到的</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">. </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">这时一早隐藏在阶段一和二的参数</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">contentType, </SPAN></SPAN><SPAN class=javascript><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">就发挥了功效</SPAN></SPAN><SPAN class=javascript><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">.<BR></SPAN></SPAN></SPAN /></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">(</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">见</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt"> </SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">阶段一的</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt"> </SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"></SPAN></P>
<P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">
<TABLE class=MsoNormalTable style="BACKGROUND: #999999; WIDTH: 100%; mso-cellspacing: .7pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellSpacing=1 cellPadding=0 width="100%" border=0>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 2.25pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 2.25pt; BACKGROUND: #dddddd; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: #d4d0c8; WIDTH: 7.2pt; PADDING-TOP: 2.25pt; BORDER-BOTTOM: #d4d0c8" vAlign=top width=10>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="COLOR: #555555; FONT-FAMILY: Courier; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">1</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Courier; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"></SPAN></P>
<P></P></TD>
<TD style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 2.25pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 2.25pt; BORDER-BOTTOM: #d4d0c8" vAlign=top>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Courier; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>response.setContentType(</SPAN><SPAN lang=EN-US style="COLOR: navy; FONT-FAMILY: Courier; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">"text/html; charset=UTF-8"</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Courier; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">); </SPAN></P>
<P></P></TD></TR></TBODY></TABLE></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">). </SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt"><BR></SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">出来的可以是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt"> utf-8, Big5, gb2312, </SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">看的就是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">JSP </SPAN></P>
<P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">
<TABLE class=MsoNormalTable style="BACKGROUND: #999999; WIDTH: 100%; mso-cellspacing: .7pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellSpacing=1 cellPadding=0 width="100%" border=0>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 2.25pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 2.25pt; BACKGROUND: #dddddd; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: #d4d0c8; WIDTH: 7.2pt; PADDING-TOP: 2.25pt; BORDER-BOTTOM: #d4d0c8" vAlign=top width=10>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="COLOR: #555555; FONT-FAMILY: Courier; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">1</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Courier; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"></SPAN></P>
<P></P></TD>
<TD style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 2.25pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 2.25pt; BACKGROUND: white; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 2.25pt; BORDER-BOTTOM: #d4d0c8" vAlign=top>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Courier; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">&lt;%@ page session=</SPAN><SPAN lang=EN-US style="COLOR: navy; FONT-FAMILY: Courier; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">"false"</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Courier; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"> pageEncoding=</SPAN><SPAN lang=EN-US style="COLOR: navy; FONT-FAMILY: Courier; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">"big5"</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Courier; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"> contentType=</SPAN><SPAN lang=EN-US style="COLOR: navy; FONT-FAMILY: Courier; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">"text/html; charset=UTF-8"</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Courier; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"> %&gt;</SPAN></P>
<P></P></TD></TR></TBODY></TABLE></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">? contentType</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">的设定</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">. </SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt"><BR><BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">**</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">还有</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">, pageEncoding </SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">contentType</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">的预设都是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt"> ISO8859-1. </SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">而随便设定了其中一个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">, </SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">另一个就跟着一样了</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">(TOMCAT<CHSDATE isrocdate="False" islunardate="False" day="30" month="12" year="1899" w:st="on" />4.1.27</CHSDATE /></SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">是如此</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">). </SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">但这不是绝对</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">, </SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">看的各自</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">JSPC</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">的处理方式</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">. </SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">而</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">pageEncoding</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">不等于</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">contentType, </SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">更有利亚洲区的文字</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt"> CJKV</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">系</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">JSP</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">网页的开发和展示</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">, (</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">例</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">pageEncoding=Big5 </SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">不等于</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt"> contentType=utf-8).<BR></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt"></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt"><FONT color=#ff0000>小结：为了能使应用兼容</FONT></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Tahoma; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt"><FONT color=#ff0000>多服务器，应按照jsp标准。对于编码问题统一使用<BR></FONT>
<TABLE class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
<TBODY>
<TR>
<TD vAlign=top align=left width=1 bgColor=#dddddd><PRE><FONT color=#555555>1<BR><BR></FONT></PRE></TD>
<TD vAlign=top align=left bgColor=#ffffff><PRE>&lt;%@ page contentType=<FONT class=java-string color=#000080>"text/html;charset=UTF-8"</FONT> pageEncoding=<FONT class=java-string color=#000080>"UTF-8"</FONT>%&gt;

</PRE></TD></TR></TBODY></TABLE></SPAN></P></DIV>]]></description>
</item><item>
<title><![CDATA[乱码问题（六）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24069</link>
<author>krf301</author>
<pubDate>2007/4/16 22:06:55</pubDate>
<description><![CDATA[
<H2 class=post-title>Tomcat中文乱码问题的原理和解决方法</H2>
<DIV class=post-body>&nbsp;　　自从接触Java和JSP以来，就不断与Java的中文乱码问题打交道，现在终于得到了彻底的解决，现将我们的解决心得与大家共享。 
<P>　　一、Java中文问题的由来</P>
<P>　　Java的内核和class文件是基于unicode的，这使Java程序具有良好的跨平台性，但也带来了一些中文乱码问题的麻烦。原因主要有两方面，Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。</P>
<P>　　首先Java（包括JSP）源文件中很可能包含有中文，而Java和JSP源文件的保存方式是基于字节流的，如果Java和JSP编译成class文件过程中，使用的编码方式与源文件的编码不一致，就会出现乱码。基于这种乱码，建议在Java文件中尽量不要写中文（注释部分不参与编译，写中文没关系），如果必须写的话，尽量手动带参数－ecoding GBK或－ecoding gb2312编译；对于JSP，在文件头加上&lt;%@ page contentType="text/html;charset=GBK"%&gt;或&lt;%@ page contentType="text/html;charset=gb2312"%&gt;基本上就能解决这类乱码问题。</P>
<P>　　本文要重点讨论的是第二类乱码，即Java程序与其他存储媒介交互时产生的乱码。很多存储媒介，如数据库，文件，流等的存储方式都是基于字节流的，Java程序与这些媒介交互时就会发生字符(char)与字节(byte)之间的转换，例如从页面提交表单中提交的数据在Java程序里显示乱码等情况。</P>
<P>　　如果在以上转换过程中使用的编码方式与字节原有的编码不一致，很可能就会出现乱码。</P>
<P>　　二、解决方法</P>
<P>　　对于流行的Tomcat来说，有以下两种解决方法：</P>
<P>　　1) 更改 D:\Tomcat\conf\server.xml，指定浏览器的编码格式为“简体中文”：</P>
<P>　　方法是找到 server.xml 中的</P>
<P>&nbsp;&nbsp;&nbsp; &lt;Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<BR>&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" acceptCount="100"<BR>&nbsp;&nbsp;&nbsp; connectionTimeout="20000" disableUploadTimeout="true" <STRONG>URIEncoding='GBK'</STRONG> /&gt;<BR></P>
<P>　　标记，粗体字是我添加的。</P>
<P>　　可以这样验证你的更改是否成功：在更改前，在你出现乱码的页面的IE浏览器，点击菜单“查看｜编码”，会发现“西欧(ISO)”处于选中状态。而更改后，点击菜单“查看｜编码”，会发现“简体中文(GB2312)”处于选中状态。</P>
<P>　　b)更该 Java 程序，我的程序是这样的：</P>
<P>public class ThreeParams extends HttpServlet {<BR>&nbsp; public void doGet(HttpServletRequest request, HttpServletResponse response)<BR>&nbsp;&nbsp; throws ServletException, IOException {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>response.setContentType("text/html; charset=GBK");<BR></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<BR>&nbsp; }&nbsp; <BR>}</P></DIV>]]></description>
</item><item>
<title><![CDATA[乱码问题（五）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24068</link>
<author>krf301</author>
<pubDate>2007/4/16 22:02:33</pubDate>
<description><![CDATA[
<DIV class=tit>jsp,struts处理中文乱码问题</DIV>
<TABLE style="TABLE-LAYOUT: fixed">
<TBODY>
<TR>
<TD>
<DIV class=cnt>
<DIV><FONT size=3>一、关于jsp处理中文乱码的问题</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;在web.xml中设置正确的编码类型，使网页在发送表单时不会出现中文乱码。</FONT></DIV>
<DIV><FONT size=3>/*</FONT></DIV>
<DIV><FONT size=3>&nbsp;*&nbsp;解决中文乱码问题，该类必须在web.xml设置，指定编码类型</FONT></DIV>
<DIV><FONT size=3>&nbsp;*/</FONT></DIV>
<DIV><FONT size=3>package&nbsp;com.login.app;</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>import&nbsp;java.io.IOException;</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>import&nbsp;javax.servlet.Filter;</FONT></DIV>
<DIV><FONT size=3>import&nbsp;javax.servlet.FilterChain;</FONT></DIV>
<DIV><FONT size=3>import&nbsp;javax.servlet.FilterConfig;</FONT></DIV>
<DIV><FONT size=3>import&nbsp;javax.servlet.ServletException;</FONT></DIV>
<DIV><FONT size=3>import&nbsp;javax.servlet.ServletRequest;</FONT></DIV>
<DIV><FONT size=3>import&nbsp;javax.servlet.ServletResponse;</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>public&nbsp;class&nbsp;SetCharacterEncodingFilter&nbsp;implements&nbsp;Filter&nbsp;{</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;String&nbsp;encoding&nbsp;=&nbsp;null;</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;FilterConfig&nbsp;filterConfig&nbsp;=&nbsp;null;</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;boolean&nbsp;ignore&nbsp;=&nbsp;true;</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;/**</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Take&nbsp;this&nbsp;filter&nbsp;out&nbsp;of&nbsp;service.</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;destroy()&nbsp;{</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.encoding&nbsp;=&nbsp;null;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.filterConfig&nbsp;=&nbsp;null;</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;}</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;doFilter(ServletRequest&nbsp;request,&nbsp;ServletResponse&nbsp;response,</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FilterChain&nbsp;chain)</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IOException,&nbsp;ServletException&nbsp;{</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Conditionally&nbsp;select&nbsp;and&nbsp;set&nbsp;the&nbsp;character&nbsp;encoding&nbsp;to&nbsp;be&nbsp;used</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ignore&nbsp;||&nbsp;(request.getCharacterEncoding()&nbsp;==&nbsp;null))&nbsp;{</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;encoding&nbsp;=&nbsp;selectEncoding(request);</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(encoding&nbsp;!=&nbsp;null)</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setCharacterEncoding(encoding);</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Pass&nbsp;control&nbsp;on&nbsp;to&nbsp;the&nbsp;next&nbsp;filter</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chain.doFilter(request,&nbsp;response);</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;}</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;/**</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Place&nbsp;this&nbsp;filter&nbsp;into&nbsp;service.</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;filterConfig&nbsp;The&nbsp;filter&nbsp;configuration&nbsp;object</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;init(FilterConfig&nbsp;filterConfig)&nbsp;throws&nbsp;ServletException&nbsp;{</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.filterConfig&nbsp;=&nbsp;filterConfig;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.encoding&nbsp;=&nbsp;filterConfig.getInitParameter("encoding");</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;=&nbsp;filterConfig.getInitParameter("ignore");</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(value&nbsp;==&nbsp;null)</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.ignore&nbsp;=&nbsp;true;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(value.equalsIgnoreCase("true"))</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.ignore&nbsp;=&nbsp;true;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(value.equalsIgnoreCase("yes"))</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.ignore&nbsp;=&nbsp;true;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.ignore&nbsp;=&nbsp;false;</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;}</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;String&nbsp;selectEncoding(ServletRequest&nbsp;request)&nbsp;{</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(this.encoding);</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;}</FONT></DIV>
<DIV><FONT size=3>}</FONT></DIV>
<DIV><FONT size=3>参照tomcat自带的filter类，自己写一个filter的子类，用来设置编码。并在web.xml上指定就可以了：</FONT></DIV>
<DIV><FONT size=3>&lt;!--filer&nbsp;in&nbsp;Chinese--&gt;&nbsp;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&lt;filter&gt;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;filter-name&gt;Set&nbsp;Character&nbsp;Encoding&lt;/filter-name&gt;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;filter-class&gt;com.login.app.SetCharacterEncodingFilter&lt;/filter-class&gt;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;encoding&lt;/param-name&gt;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;GBK&lt;/param-value&gt;&lt;!—在此处设置相应的编码à</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&lt;/filter&gt;</FONT></DIV>
<DIV><FONT size=3>&nbsp;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&lt;filter-mapping&gt;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;filter-name&gt;Set&nbsp;Character&nbsp;Encoding&lt;/filter-name&gt;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;</FONT></DIV>
<DIV><FONT size=3>&nbsp;&lt;/filter-mapping&gt;</FONT></DIV>
<DIV><FONT size=3>把以上代码放在web.xml中&lt;display-name&gt;Encoding&nbsp;Application&lt;/display-name&gt;的后面.</FONT></DIV>
<DIV>
<DIV align=left><SPAN style="FONT-SIZE: 12pt">二、在struts中处理中文乱码问题：</SPAN></DIV>
<DIV align=left><SPAN style="FONT-SIZE: 12pt">要解决在提交表单时，中文不会出显乱码，只须继承RequestProcessor类，重写processPreprocess这个方法，则可以解决。</SPAN></DIV>
<DIV align=left><SPAN style="FONT-SIZE: 12pt">package&nbsp;com.login.app;</SPAN></DIV>
<DIV align=left><SPAN style="FONT-SIZE: 12pt">import&nbsp;javax.servlet.http.HttpServletRequest;<BR>import&nbsp;javax.servlet.http.HttpServletResponse;</SPAN></DIV>
<DIV align=left><SPAN style="FONT-SIZE: 12pt">import&nbsp;org.apache.struts.action.RequestProcessor;</SPAN></DIV>
<DIV align=left><SPAN style="FONT-SIZE: 12pt">public&nbsp;class&nbsp;MyRequestProcessor&nbsp;extends&nbsp;RequestProcessor{<BR>&nbsp;public&nbsp;MyRequestProcessor(){}<BR>&nbsp;protected&nbsp;boolean&nbsp;processPreprocess(HttpServletRequest&nbsp;request,<BR>&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response){<BR>&nbsp;&nbsp;try{<BR>&nbsp;&nbsp;&nbsp;request.setCharacterEncoding("UTF-8");//</SPAN><SPAN style="FONT-SIZE: 12pt">在此设置字符集<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;catch(Exception&nbsp;ex){<BR>&nbsp;&nbsp;&nbsp;System.out.println("字符集设置失败");<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;return&nbsp;true;<BR>&nbsp;}<BR>}</SPAN></DIV>
<DIV align=left><SPAN style="FONT-SIZE: 12pt">并在struts-config.xml设置相应的&lt;controller&gt;，如下所示：</SPAN></DIV>
<DIV align=left><SPAN style="FONT-SIZE: 12pt">&lt;controller&nbsp;processorClass="com.login.app.MyRequestProcessor"/&gt;</SPAN></DIV></DIV>
<DIV><FONT size=3>&nbsp;三、解决插入和读取数据库数据时出现的中文乱码</FONT></DIV>
<DIV><FONT size=3>插入数据到数据库时出现乱码：</FONT></DIV>
<DIV><FONT size=3>这种乱码会使你插入数据库的中文变成乱码，或者读出显示时也是乱码，解决方法如下：</FONT></DIV>
<DIV><FONT size=3>在数据库连接字符串中加入编码字符集</FONT></DIV>
<DIV><FONT size=3>String&nbsp;url=”jdbc:mysql://localhost/test?user=root&amp;password=root&amp;useUnicode=true&amp;characterEncoding=UTF-8"</FONT></DIV>
<DIV><FONT size=3>把characterEncoding的值设置成你期望的编码。</FONT></DIV>
<DIV><FONT size=3>无论你是用哪种方式连接数据库，只要在url后面加上useUnicode=true&amp;characterEncoding=UTF-8"就可以解决中文乱码问题，当然你提交的数据编码也必须是UTF-8的，总而言之，在构造一个网站，整个网站必须采用统一的编码。支持中文的编码有GBK,gb2312,UTF-8等。</FONT></DIV>
<DIV><FONT size=3>例如在struts中利用数据源连接数据库，必须在struts-config.xml做如下配置：</FONT></DIV>
<DIV><FONT size=3>&lt;data-sources&gt;</FONT></DIV>
<DIV><FONT size=3>&lt;!--&nbsp;设置数据源标识&nbsp;--&gt;</FONT></DIV>
<DIV><FONT size=3>&lt;data-source&nbsp;key="mysqlDB1"&nbsp;type="org.apache.tomcat.dbcp.dbcp.BasicDataSource"&gt;</FONT></DIV>
<DIV><FONT size=3>&lt;!--&nbsp;设置数据库驱动对应类名&nbsp;--&gt;</FONT></DIV>
<DIV><FONT size=3>&lt;set-property&nbsp;property="driverClassName"&nbsp;value="org.gjt.mm.mysql.Driver"/&gt;</FONT></DIV>
<DIV><FONT size=3>&lt;!--&nbsp;设置待连接数据源URL&nbsp;--&gt;</FONT></DIV>
<DIV><FONT size=3>&lt;set-property&nbsp;property="url"&nbsp;value="jdbc:mysql://localhost/firststruts?useUnicode=true&amp;charact&nbsp;erEncoding=UTF-8"/&gt;</FONT></DIV>
<DIV><FONT size=3>&lt;!--&nbsp;设置同时打开连接的最大数目&nbsp;--&gt;</FONT></DIV>
<DIV><FONT size=3>&lt;set-property&nbsp;property="maxActive"&nbsp;value="5"/&gt;</FONT></DIV>
<DIV><FONT size=3>&lt;!--&nbsp;设置登录数据库服务器用户名及密码&nbsp;--&gt;</FONT></DIV>
<DIV><FONT size=3>&lt;set-property&nbsp;property="username"&nbsp;value="root"/&gt;</FONT></DIV>
<DIV><FONT size=3>&lt;set-property&nbsp;property="password"&nbsp;value=""/&gt;</FONT></DIV>
<DIV><FONT size=3>&lt;!--&nbsp;设置事务处理中的自动提交&nbsp;--&gt;</FONT></DIV>
<DIV><FONT size=3>&lt;set-property&nbsp;property="autoCommit"&nbsp;value</FONT></DIV></DIV></TD></TR></TBODY></TABLE>]]></description>
</item><item>
<title><![CDATA[乱码问题（四）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24066</link>
<author>krf301</author>
<pubDate>2007/4/16 20:42:25</pubDate>
<description><![CDATA[
<TABLE cellSpacing=0 cellPadding=0 width=600 bgColor=#eeeeee border=0>
<TBODY>
<TR>
<TD align=middle bgColor=#003399 height=10><FONT color=#ffffff>标题</FONT></TD>
<TD><B>&nbsp;&nbsp;&nbsp;&nbsp;<B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">java</B>中文内部<A name=baidusnap0></A><B style="COLOR: black; BACKGROUND-COLOR: #ffff66">乱码</B>处理</B>&nbsp;&nbsp;&nbsp;</TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR>
<TR>
<TD align=middle bgColor=#003399><FONT color=#ffffff>关键字</FONT></TD>
<TD width=500>&nbsp;&nbsp;&nbsp;&nbsp;<B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">java</B>，&nbsp;中文内部</TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR></TBODY></TABLE><!--文章说明信息结束//-->
<TABLE width=600 border=0>
<TBODY>
<TR>
<TD align=left><!--内容开始//--><BR>
<P>在jsp中，中文<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">乱码</B>常会让人心乱如麻。一般的解决方案<BR>一、本页显示问题<BR>"&lt;%@ page contentType="text/html;charset=GB2312"%&gt;"<BR>二、提交问题<BR>鉴于此问题，你可以将读出来的字符串进行转换，这很简单：<BR>str = request.getParameter("s");<BR>str = new String(str.getBytes("ISO-8859-1"),"GBK");<BR>或者设置<BR>request.setCharacterEncoding("GBK");　</P>
<P><FONT size=5>然而，你遇到这种情况吗，使用out.println是中文，Systemout.println是<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">乱码</B>，看下面的例子</FONT></P>
<P><FONT size=5>jsp1.jsp建立</FONT></P>
<P>&lt;%@ page contentType="text/html;charset=GB2312"%&gt;<BR>&lt;html&gt;<BR>&lt;head&gt;<BR>&lt;title&gt;<BR>mm<BR>&lt;/title&gt;<BR>&lt;/head&gt;<BR>&lt;body background=""&gt;<BR>&lt;form method="POST" action="servlet1"&gt;<BR>&lt;input type="text" name="myt" size="30" value ="&amp;nbsp;"&gt;<BR>&lt;br&gt;<BR>&lt;input type="text" name="myedit" size="30" value =""&gt;<BR>&lt;input type="submit" value="保&nbsp; 存" name="B5" &gt;<BR>&lt;/form&gt;<BR>&lt;/body&gt;<BR>&lt;/html&gt;</P>
<P>-----</P>
<P>servlet1 <FONT size=5>建立</FONT></P>
<P>package untitled2;</P>
<P>import javax.servlet.*;<BR>import javax.servlet.http.*;<BR>import <B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">java</B>.io.*;<BR>import <B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">java</B>.util.*;</P>
<P>public class Servlet1 extends HttpServlet {</P>
<P>&nbsp;&nbsp;&nbsp; public void doPost(HttpServletRequest request,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws ServletException, IOException<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setContentType("text/html;charset=GBK") ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setCharacterEncoding("GBK");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintWriter out = response.getWriter() ;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println(request.getParameter("myedit"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(request.getParameter("myedit"));<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>}</P>
<P>编译后在ie运行，myedit中输入汉字，就会出现我说<B style="COLOR: black; BACKGROUND-COLOR: #ffff66">乱码</B>，可别小看，对你有用System.out.println的输出，本人经过反复的调试，发现将</P>
<P><FONT size=5>&lt;input type="text" name="myt" size="30" value ="&amp;nbsp;"&gt;中"&amp;nbsp;"修改为""，就没有问题了。</FONT>"&amp;nbsp;"我们经常用就是空，到底是什么问题导致，我还不清楚。</P>
<P>我用的jbuild7.0,jdevelop9.03都有此问题。</P></TD></TR></TBODY></TABLE>]]></description>
</item><item>
<title><![CDATA[乱码问题（三）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=krf301&amp;id=24065</link>
<author>krf301</author>
<pubDate>2007/4/16 20:39:11</pubDate>
<description><![CDATA[
<H1>java中文乱码解决方案和经验</H1>
<DIV class=clear>　</DIV><!-- main -->
<DIV id=endMain>
<DIV id=endText><STRONG>1.字节和unicode </STRONG><BR>java内核是unicode的，就连class文件也是，但是很多媒体，包括文件/流的保存方式是使用字节流的。因此java要对这些字节流经行转化。char是unicode的，而byte是字节。java中byte/char互转的函数在sun.io的包中间有。其中ByteToCharConverter类是中调度，可以用来告诉你，你用的convertor。其中两个很常用的静态函数是 <BR><CODE>public static ByteToCharConverter getDefault(); <BR>public static ByteToCharConverter getConverter(String encoding); <BR></CODE>如果你不指定converter，则系统会自动使用当前的encoding,gb平台上用gbk,en平台上用8859_1。 <BR>byte ——〉char： <BR>"你"的gb码是：0xc4e3 ,unicode是0x4f60 <BR><CODE>String encoding = "gb2312"; <BR>byte b[] = {(byte)'\u00c4',(byte)'\u00e3'}; <BR>ByteToCharConverter converter = ByteToCharConverter.getConverter(encoding); <BR>char c[] = converter.convertAll(b); <BR>for (int i = 0; i &lt; c.length; i++) { <BR>System.out.println(Integer.toHexString(c[i])); <BR>} <BR></CODE>结果是什么？0x4f60 <BR>如果encoding ="8859_1"，结果又是什么？0x00c4,0x00e3 <BR>如果代码改为 <BR><CODE>byte b[] = {(byte)'\u00c4',(byte)'\u00e3'}; <BR>ByteToCharConverter converter = ByteToCharConverter. getDefault(); <BR>char c[] = converter.convertAll(b); <BR>for (int i = 0; i &lt; c.length; i++) { <BR>System.out.println(Integer.toHexString(c[i])); <BR>} <BR></CODE>结果将又是什么？根据平台的编码而定。 <BR><BR><CODE>char ——〉byte： <BR>String encoding = "gb2312"; <BR>char c[] = {'\u4f60'}; <BR>CharToByteConverter converter = CharToByteConverter.getConverter(encoding); <BR>byte b[] = converter.convertAll(c); <BR>for (int i = 0; i &lt; b.length; i++) { <BR>System.out.println(Integer.toHexString(b[i])); <BR>} <BR></CODE>结果是什么？0x00c4,0x00e3 <BR>如果encoding ="8859_1"，结果又是什么？0x3f <BR>如果代码改为 <BR><CODE>String encoding = "gb2312"; <BR>char c[] = {'\u4f60'}; <BR>CharToByteConverter converter = CharToByteConverter.getDefault(); <BR>byte b[] = converter.convertAll(c); <BR>for (int i = 0; i &lt; b.length; i++) { <BR>System.out.println(Integer.toHexString(b[i])); <BR>} <BR></CODE>结果将又是什么？根据平台的编码而定。 <BR>很多中文问题就是从这两个最简单的类派生出来的。而却有很多类不直接支持把encoding输入，这给我们带来诸多不便。很多程序难得用encoding了，直接用default的encoding，这就给我们移植带来了很多困难。 <BR><BR><STRONG>2.utf-8 </STRONG><BR>utf-8是和unicode一一对应的，其实现很简单 <BR>7位的unicode: 0 _ _ _ _ _ _ _ <BR>11位的unicode: 1 1 0 _ _ _ _ _ 1 0 _ _ _ _ _ _ <BR>16位的unicode: 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ <BR>21位的unicode: 1 1 1 1 0 _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ <BR>大多数情况是只使用到16位以下的unicode: <BR>"你"的gb码是：0xc4e3 ,unicode是0x4f60 <BR>0xc4e3的二进制： <BR>1100 ，0100 ，1110 ，0011 <BR>由于只有两位我们按照两位的编码来排，但是我们发现这行不通，因为第７位不是0因此，返回"?" <BR>0x4f60的二进制： <BR>0100 ，1111 ，0110 ，0000 <BR>我们用utf-8补齐，变成： <BR>1110 ，0100 ，1011 ，1101 ，1010 ，0000 <BR>e4--bd-- a0 <BR>于是返回：0xe4,0xbd,0xa0。 <BR><BR><STRONG>3.string和byte[] </STRONG><BR>string其实核心是char[],然而要把byte转化成string，必须经过编码。string.length()其实就是char数组的长度，如果使用不同的编码，很可能会错分，造成散字和乱码。 <BR>例如： <BR><CODE>String encoding = “”; <BR>byte [] b={(byte)'\u00c4',(byte)'\u00e3'}; <BR>String str=new String(b,encoding);　　 <BR></CODE>如果encoding=8859_1，会有两个字，但是encoding=gb2312只有一个字这个问题在处理分页是经常发生 。 <BR><BR><STRONG>4.Reader,Writer / InputStream,OutputStream </STRONG><BR>Reader和Writer核心是char，InputStream和OutputStream核心是byte。但是Reader和Writer的主要目的是要把char读/写InputStream/OutputStream。 <BR>例如： <BR>文件test.txt只有一个"你"字，0xc4,0xe3 <BR><CODE>String encoding = "gb2312"; <BR>InputStreamReader reader = new InputStreamReader(new FileInputStream( <BR>"text.txt"), encoding); <BR>char c[] = new char[10]; <BR>int length = reader.read(c); <BR>for (int i = 0; i &lt; length; i++) { <BR>System.out.println(c[i]); <BR>} <BR></CODE>结果是什么？你 <BR>如果encoding ="8859_1"，结果是什么？??两个字符，表示不认识。 <BR>反过来的例子自己做。 <BR><BR><STRONG>5.我们要对java的编译器有所了解 </STRONG>： <BR>javac ?encoding <BR>我们常常没有用到encoding这个参数。其实encoding这个参数对于跨平台的操作是很重要的。如果没有指定encoding，则按照系统的默认encoding,gb平台上是gb2312，英文平台上是iso8859_1。 <BR>java的编译器实际上是调用sun.tools.javac.main的类，对文件进行编译，这个类有compile函数中间有一个encoding的变量,-encoding的参数其实直接传给encoding变量。编译器就是根据这个变量来读取java文件的，然后把用utf-8形式编译成class文件。 <BR>例子代码： <BR><CODE>String str = "你"; <BR>FileWriter writer = new FileWriter("text.txt"); <BR>write.write(str); <BR>writer.close(); <BR><BR></CODE>如果用gb2312编译，你会找到e4 bd a0的字段 ； <BR>如果用8859_1编译， 00c4 00e3的二进制： <BR>0000，0000 ，1100，0100 ，0000，0000 ，1110，0011 <BR>因为每个字符都大于7位，因此用11位编码： <BR>1100，0001，1000，0100，1100，0011，1010，0011 <BR>c1-- 84--　c3--　 a3 <BR>你会找到c1 84 c3 a3 。 <BR><BR>但是我们往往忽略掉这个参数，因此这样往往会有跨平台的问题： <BR>样例代码在中文平台上编译，生成zhclass <BR>样例代码在英文平台上编译，输出enclass <BR>(1).　 zhclass在中文平台上执行ok,但是在英文平台上不行 <BR>(2). enclass在英文平台上执行ok,但是在中文平台上不行 <BR>原因： <BR>(1). 在中文平台上编译后，其实str在运行态的char[]是0x4f60,　在中文平台上运行，filewriter的缺省编码是gb2312,因此 chartobyteconverter会自动用调用gb2312的converter,把str转化成byte输入到fileoutputstream中，于是0xc4,0xe3放进了文件。 <BR>但是如果是在英文平台下，chartobyteconverter的缺省值是8859_1, filewriter会自动调用8859_1去转化str,但是他无法解释，因此他会输出"?" <BR>(2). 在英文平台上编译后，其实str在运行态的char[]是0x00c4 0x00e3, 在中文平台上运行，中文无法识别，因此会出现??； <BR>在英文平台上，0x00c4--&gt;0xc4,0x00e3-&gt;0xe3，因此0xc4,0xe3被放进了文件。 <BR><BR><STRONG>6. 其它原因： </STRONG>&lt;%@ page contentType="text/html; charset=GBK" %&gt; <BR>设置浏览器的显示编码，如果response的数据是utf8编码，显示将是乱码，但是乱码和上述原因还不一样。 <BR><BR><STRONG>7. 发生编码的地方 </STRONG>： <BR>&#61548; 从数据库到java程序 byte——〉char <BR>&#61548; 从java程序到数据库 char——〉byte <BR>&#61548; 从文件到java程序 byte——〉char <BR>&#61548; 从java程序到文件 char——〉byte <BR>&#61548; 从java程序到页面显示 char——〉byte <BR>&#61548; 从页面form提交数据到java程序byte——〉char <BR>&#61548; 从流到java程序byte——〉char <BR>&#61548; 从java程序到流char——〉byte <BR><BR>谢志钢的解决方法： <BR>我是使用配置过滤器的方法解决中文乱码的： <BR><BR><CODE>＜web-app&gt; <BR>＜filter&gt; <BR>＜filter-name&gt;RequestFilter&lt;/filter-name&gt; <BR>＜filter-class&gt;net.golden.uirs.util.RequestFilter&lt;/filter-class&gt; <BR>＜init-param&gt; <BR>＜param-name&gt;charset&lt;/param-name&gt; <BR>＜param-value&gt;gb2312&lt;/param-value&gt; <BR>＜/init-param&gt; <BR>＜/filter&gt; <BR>＜filter-mapping&gt; <BR>＜filter-name&gt;RequestFilter&lt;/filter-name&gt; <BR>＜url-pattern&gt;*.jsp&lt;/url-pattern&gt; <BR>＜/filter-mapping&gt; <BR>＜/web-app&gt; <BR><BR><BR>public void doFilter(ServletRequest req, ServletResponse res, <BR>FilterChain fChain) throws IOException, ServletException { <BR>HttpServletRequest request = (HttpServletRequest) req; <BR>HttpServletResponse response = (HttpServletResponse) res; <BR>HttpSession session = request.getSession(); <BR>String userId = (String) session.getAttribute("userid"); <BR>req.setCharacterEncoding(this.filterConfig.getInitParameter("charset")); // 设置字符集？ <BR>实际上是设置了byte ——〉char的encoding <BR>try { <BR>if (userId == null || userId.equals("")) { <BR>if (!request.getRequestURL().toString().matches( <BR>".*/uirs/logon/logon(Controller){0,1}\\x2Ejsp$")) { <BR>session.invalidate(); <BR>response.sendRedirect(request.getContextPath() + <BR>"/uirs/logon/logon.jsp"); <BR>} <BR>} <BR>else { // 看看是否具有信息上报系统的权限 <BR>if (!net.golden.uirs.util.UirsChecker.check(userId, "信息上报系统", <BR>net.golden.uirs.util.UirsChecker.ACTION_DO)) { <BR>if (!request.getRequestURL().toString().matches( <BR>".*/uirs/logon/logon(Controller){0,1}\\x2Ejsp$")) { <BR>response.sendRedirect(request.getContextPath() + <BR>"/uirs/logon/logonController.jsp"); <BR>} <BR>} <BR>} <BR>} <BR>catch (Exception ex) { <BR>response.sendRedirect(request.getContextPath() + <BR>"/uirs/logon/logon.jsp"); <BR>} <BR>fChain.doFilter(req, res); <BR>} </CODE></DIV></DIV>]]></description>
</item>
</channel>
</rss>