﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-成就梦想-随笔分类-基础知识</title><link>http://www.blogjava.net/iamct/category/51417.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 18 Apr 2012 07:13:37 GMT</lastBuildDate><pubDate>Wed, 18 Apr 2012 07:13:37 GMT</pubDate><ttl>60</ttl><item><title>java 编码  </title><link>http://www.blogjava.net/iamct/archive/2012/04/18/375059.html</link><dc:creator>iamct</dc:creator><author>iamct</author><pubDate>Wed, 18 Apr 2012 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/iamct/archive/2012/04/18/375059.html</guid><wfw:comment>http://www.blogjava.net/iamct/comments/375059.html</wfw:comment><comments>http://www.blogjava.net/iamct/archive/2012/04/18/375059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iamct/comments/commentRss/375059.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamct/services/trackbacks/375059.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 我们部门底层的web应用有一套处理编码的流程机制，主要处理因历史原因或者跨部门产品之间gbk和utf8剪不清理还乱的关系。<br />前2天同事有询问相关编码的问题，在此做个整理，希望能够对大家有所帮助。<br /><br />首先是编码的历史，这是一个<a title="很有意思的解读" href="http://www.blogjava.net/iamct/articles/374954.html">很有意思的解读</a> 。写的很幽默，便于理解。<br /><br />下面主要写于与java想关的编码，主要解读unicode ，utf8 和gbk。<br /><br /><div>JVM里面的任何字符串资源都是Unicode，就是说，任何String类型的数据都是Unicode编码。没有例外，因此我们可以这么说，JVM里面的String是不带编码的。因为他就有且只对应一种Unicode。</div><div>一个字符的Unicode编码是确定的。也就是说Unicode是一种字符集，里面字符与编码是一一对应的，这里有个码表可查,<a href="http://zh.wikipedia.org/wiki/Unicode%E5%AD%97%E7%AC%A6%E5%B9%B3%E9%9D%A2%E6%98%A0%E5%B0%84">unicode 码表</a>。但是在实际传输过程中，由于不同系统平台的设计不一定一致，以及出于节省空间的目的，对Unicode编码的实现方式有所不同。Unicode的实现方式称为<strong>Unicode转换格式</strong>（Unicode Transformation Format，简称为UTF）。我们常用的就是UTF8.<br />UTF8是如何存储一个Unicode编码的呢。也就是utf8作为一种Unicode Transformation Format是如何工作的呢？<br />首先utf8 是可变长的，UTF-8使用一至四个字节为每个字符编码。参照下表，我们把精力放在第1列，第3列，和注释。<br /><div><img src="data:image/png;base64,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" alt="" /></div><div>对于ASCII字符，可以用七个bit位来表示，x6 x5 x4 x3 x2 x1 x0.第八个bit永远是0。<br /><div>第128到2047个字节，要用10个bit来表示，110yyyyy(C0-DF) 10zzzzzz(80-BF)<br /><div>第2048到65535个字节，要用16个bit来表示，Utf-8把这些字节编成下面这样的三个byte。1110xxxx(E0-EF) 10yyyyyy 10zzzzzz</div>大于65535其余用4个byte来表示。<br /><br />举个例子：&#8220;中国&#8221;的中，unicode编码是&#8220;\u4e2d", 对应的编码除了查表，java可以用命令行，运行 native2ascii 进行转化。<br />用window 自带的附件中的计算器（查看-&gt;科学型），转化成10进制为20013，二进制是<span style="color: red;">100111000101101</span>&nbsp; <br />通过上面的表，可知，转化成utf8后为三个字节。<br /><div>只需要将刚才转化的二进制（上面标红的）将下面的xxxx，yyyyyy，zzzzzz补齐即可。<br /> <div>1110xxxx(E0-EF) 10yyyyyy 10zzzzzz，我们从低位开始补起，不够的用0补齐。<br />1110<span style="color: red;">0</span><span style="color: red;">100</span> 10<span style="color: red;">111000</span> 10<span style="color: red;"></span><span style="color: red;">101101</span>&nbsp; ，换成16进制为E4 B8 AD。 <br />好了我们用java代码来验证下，是否正确。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;ha&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">中</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">byte</span><span style="color: #000000; ">&nbsp;b[]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ha.getBytes(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">utf-8</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;b.length;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(Integer.toHexString(b[i]).substring(</span><span style="color: #000000; ">6</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><div><img src="data:image/png;base64,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" alt="" /></div>输出果然是：e4&nbsp; b8 ad。<br />utf8 wiki中有下描述：<br /><div><ul><li>对于UTF-8编码中的任意字节B，如果B的第一位为0，则B为ASCII码，并且B独立的表示一个字符;</li><li>如果B的第一位为1，第二位为0，则B为一个非ASCII字符（该字符由多个字节表示）中的一个字节，并且不为字符的第一个字节编码;</li><li>如果B的前两位为1，第三位为0，则B为一个非ASCII字符（该字符由多个字节表示）中的第一个字节，并且该字符由两个字节表示;</li><li>如果B的前三位为1，第四位为0，则B为一个非ASCII字符（该字符由多个字节表示）中的第一个字节，并且该字符由三个字节表示;</li><li>如果B的前四位为1，第五位为0，则B为一个非ASCII字符（该字符由多个字节表示）中的第一个字节，并且该字符由四个字节表示;</li></ul> <p>因此，对UTF-8编码中的任意字节，根据第一位，可判断是否为ASCII字符;根据前二位，可判断该字节是否为一个字符编码的第一个字节;  根据前四位（如果前两位均为1），可确定该字节为字符编码的第一个字节，并且可判断对应的字符由几个字节表示;根据前五位（如果前四位为1），可判断编码 是否有错误或数据传输过程中是否有错误。</p></div><br />反过来，我们还是拿刚才的&#8221;中&#8220;为例，1110<span style="color: red;">0</span><span style="color: red;">100</span> 10<span style="color: red;">111000</span> 10<span style="color: red;">101101</span> ，第一个字节开始为110，则读第二个字节为10，第三个字节为10，则认为是utf8字符。<br />于是就有了一个那个经典的&#8220;联通"干不过&#8221;移动&#8220;的经典段子。<br />我们在xp下，随便建立一个文件，输入"联通"，保存，这时你在打开是，发现&#8221;联通"2个字符不见了。奇怪吗？？？？？？<br /><div>我们知道默认保存的编码是ANSI，实际也是类GBK的编码。</div><div>对应16进制为c1 aa cd a8， 转化成二进制为11000001 10101010 11001101 10101000 ，我们来看，110xxxxx，10xxxxxx 正好符合utf8的形式。<br />这时候文件编写器以为你的文件是utf8的文件，然后默认已utf8的形式给你打开展示。于是就出现乱码了。如果你在&#8221;联通&#8220;后面随便加几个字符。就不出出现灵异事件了。<br /><br />那么我们继续讨论 GBK和Unicode是什么关系呢？<br />实际上GBK我们可以看做是字符集，他也有自己一一对应的码表。google一下，很容易查到。这里有个Unicode和GBk对应的表<a title="Unicode-GBk" href="http://icu-project.org/repos/icu/data/trunk/charset/source/gb18030/gbkuni30.txt">Unicode-GBk</a>。<br />在java中，<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">"</span><span style="color: #000000; ">我爱你莎莎</span><span style="color: #000000; ">"</span><span style="color: #000000; ">.getBytes(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">gbk</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);</span></div></div>进行转化，其实就是类似查一个Unicode和GBk对应表进行转化的。大家看一下Charset这个抽象类的那些子类就明白了。<br />通过上面的描述GBk和UTF8关系也就很明朗了，完全可以通过Unicode进行中转。<br /><br />同事在询问编码的问题时，一开始对类似如下代码,相互转变不太理解。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; "></span><div>byte b1[] = null;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;b1 = "我爱你莎莎".getBytes("gbk");<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println(new String(b1,"gbk"));<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;byte b2[] = null;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;b2 = "我爱你莎莎".getBytes("utf8");<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println(new String(b2,"utf8"));<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println(new String (new String (b2,"gbk").getBytes("gbk"),"utf8"));</div><span style="color: #000000; "></span></div>其实我们可以把getBytes（"gbk"），这个函数当做将unicode用gkb加密的过程，而new String（&#8221;xxx&#8220;，"编码&#8221;）看成是解密的一个过程。<br /><br />大家思考一下最后面的那个输出可以得到正确的结果吗？为什么？<br /><br />下面我们来讨论 ，通过http协议下的url传输后，编码转化问题。<br />首先说明的是本人本地默认编码是gbk。<br />我们只用Servlet，不使用任何框架比如spring（因为使用框架时，框架也有一套自己自己的机制）如下代码<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;HttpEncode&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;HttpServlet&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">protected</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;doGet(HttpServletRequest&nbsp;req,&nbsp;HttpServletResponse&nbsp;resp)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;ServletException,&nbsp;IOException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;req.getQueryString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(req.getCharacterEncoding());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;encode&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encode&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;req.getParameter(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">encode</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(encode);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</span></div>我们分别用jetty（版本6.1）和resin(版本3.1.8)下容器，测试如下请求&nbsp;&nbsp;&nbsp;&nbsp; 127.0.0.1/test?encode=%B9%FE&nbsp; 其中%B9%FE为GBk的编码的汉字&#8221;哈&#8220;<br />jetty容器下输出为<br /><div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">null<br />encode=%B9%FE<br />?</span></div></div>resin下为：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">null<br />encode=%B9%FE<br />null</span></div><br />换做127.0.0.1/test?encode=%E5%93%88&nbsp;&nbsp; ，utf8编码的&#8221;哈&#8220;<br />jetty和resin下都输出如下<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">null<br />encode=%E5%93%88<br />哈</span></div><br />为什么会是这样？<br />我们拿jetty分析，在jetty的源码中，<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;String&nbsp;getParameter(String&nbsp;name)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">_paramsExtracted)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extractParameters();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;(String)&nbsp;_parameters.getValue(name,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><div><span style="color: #000000; "><span style="color: #000000; "><div><span style="color: #000000; ">对应的 </span></div>extractParameters(); 部分代码<br /><div>&nbsp;if (_queryEncoding==null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _uri.decodeQueryTo(_baseParameters);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />然后</div><div>&nbsp;&nbsp; public void decodeQueryTo(MultiMap parameters) <br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_query==_fragment)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _utf8b.reset();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UrlEncoded.decodeUtf8To(_raw,_query+1,_fragment-_query-1,parameters,_utf8b);<br />&nbsp;&nbsp;&nbsp; }</div><br /></span></span></div><div><span style="color: #000000; "><br /></span></div><br /><br /></span></div><br /><br /><div></div>也就是如果<span style="color: #000000; "><span style="color: #000000; "><span style="color: #000000; ">_queryEncoding</span></span></span>为null时，默认是用utf8进行解码的。而resin也不例外。<br />jetty中<span style="color: #000000; "><span style="color: #000000; "><span style="color: #000000; ">_queryEncoding</span></span></span>的值可以通过org.mortbay.jetty.Request.queryEncoding 这个属性给赋值而resin采用的是req.getCharacterEncoding()中的值为标准。<br />要想在jetty下 127.0.0.1/test?encode=%B9%FE，获取到正确的字符，代码如下<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">protected</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;doGet(HttpServletRequest&nbsp;req,&nbsp;HttpServletResponse&nbsp;resp)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;ServletException,&nbsp;IOException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;req.getQueryString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(req.getCharacterEncoding());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.setAttribute(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">org.mortbay.jetty.Request.queryEncoding</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">gbk</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;encode&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encode&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;req.getParameter(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">encode</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(encode);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><br />resin下只需要<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">protected</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;doGet(HttpServletRequest&nbsp;req,&nbsp;HttpServletResponse&nbsp;resp)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;ServletException,&nbsp;IOException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;req.getQueryString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.setCharacterEncoding(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">gbk</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(req.getCharacterEncoding());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;encode&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encode&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;req.getParameter(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">encode</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(encode);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><br />通过上面想说明的是，不同的容器，默认编码的策略是不一致的。只要我们了解编码的基础知识。通过一些封装就很容易掌控这个局面。</div></div></div></div></div></div><br /><br /><br /><br /><br />参考资料：<div>Unicode wiki:&nbsp;&nbsp; http://zh.wikipedia.org/wiki/Unicode<br />jetty 源码</div><img src ="http://www.blogjava.net/iamct/aggbug/375059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamct/" target="_blank">iamct</a> 2012-04-18 11:38 <a href="http://www.blogjava.net/iamct/archive/2012/04/18/375059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>