﻿<?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/merek/category/21902.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 24 Apr 2007 13:14:49 GMT</lastBuildDate><pubDate>Tue, 24 Apr 2007 13:14:49 GMT</pubDate><ttl>60</ttl><item><title>编码问题</title><link>http://www.blogjava.net/merek/articles/112904.html</link><dc:creator>小麦</dc:creator><author>小麦</author><pubDate>Mon, 23 Apr 2007 03:16:00 GMT</pubDate><guid>http://www.blogjava.net/merek/articles/112904.html</guid><wfw:comment>http://www.blogjava.net/merek/comments/112904.html</wfw:comment><comments>http://www.blogjava.net/merek/articles/112904.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/merek/comments/commentRss/112904.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/merek/services/trackbacks/112904.html</trackback:ping><description><![CDATA[<p>&nbsp; 本文中的大部分内容都来自互联网,我所做的工作仅仅是把一些资料做了一下总结,希望对大家有一点点帮助!本文有待完善和测试,希望看过本文的各位朋友对本文存在的问题提出批评和指正,并期盼您的建议,多谢!!!<br>&nbsp; 第一，存文件必须以一种编码存；读文件也必须以一种编码读，如不特别设置，取系统默认的编码，中文windows为GBK编码。</p>
<p>从.java-&gt;.class过程是，先编写.java文件并按莫种编码方式保存，然后用javac方法编译此文件，注意如.java没按系统默认编码保存则要带encoding参数指明实际编码，否则出错，生成的.class文件存为系统默认编码。</p>
<p>从.jsp-&gt;.java-&gt;.class，先存为某种编码的.jsp文件，然后tomcat根据pageEncoding读取并转化为servlet存为系统默认编码，然后同上面.java-&gt;.class过程。<br>&nbsp; 第二，IDE的encoding为对系统下文件打开的解码方式或保存的编码方式。特例：如果.jsp文件有&lt;%@ page language="java" pageEncoding="UTF-8"%&gt;，则eclipse会自动存为UTF-8方式，不管eclipse的encoding是什么，这也是eclipse的聪明之处。<br>&nbsp; 第三，<br>pageEncoding="UTF-8"表示此文件的编码方式，必须与此文件存储方式一致（所以eclipse会首选根据它来存文件），tomcat根据这个来读此.jsp文件并编译为servlet。<br>contentType="text/html;charset=UTF-8"表示当浏览器得到此文件时以什么方式解码。例如：<br>&lt;%@ page language="java" pageEncoding="UTF-8"%&gt;<br>&lt;%@ page contentType="text/html;charset=iso8859-1"%&gt;<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;title&gt;test&lt;/title&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>我是个好人<br>&lt;/body&gt;<br>&lt;/html&gt;<br>会产生乱码，因为存为UTF-8的文件被解码为iso8859-1，这样 如有中文肯定出乱码。</p>
<p>至此，页面应为：<br>&lt;%@ page language="java" pageEncoding="UTF-8"%&gt;<br>&lt;%@ page contentType="text/html;charset=UTF-8"%&gt;<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;title&gt;中文问题&lt;/title&gt;<br>&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;<br>&lt;/head&gt;<br>&lt;/html&gt;</p>
<p>&nbsp; 第四，<br>request.setCharacterEncoding("UTF-8")是把提交内容的字符集设为UTF－8<br>response.setCharacterEncoding("UTF-8")可以把页面中的&lt;%@ page contentType="text/html;charset=iso8859-1"%&gt;换为charset=UTF-8，是给告诉浏览器我这个文件的编码方式。<br>第五，表单提交：无论何种表单提交都可以在后台的java文件中通过String des = new String(s.getBytes("iso8859-1"),"UTF-8");来转换成你想要的UTF－8编码方式。但如果每处都加词句太麻烦，故分post和get两种方式区分提交（tomcat5以后分开处理，之前处理方式一样，即都可以用request.setCharacterEncoding("UTF-8")方法处理，不过tomcat5以后get提交方法用此语句无效）。<br>1,post提交的数据: <br>程序加上org.springframework.web.filter.CharacterEncodingFilter过滤器. <br>&lt;filter&gt; <br>&lt;filter-name&gt;encodingFilter&lt;/filter-name&gt; <br>&lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt; <br>&lt;init-param&gt; <br>&lt;param-name&gt;encoding&lt;/param-name&gt; <br>&lt;param-value&gt;UTF8&lt;/param-value&gt; <br>&lt;/init-param&gt; <br>&lt;init-param&gt; <br>&lt;param-name&gt;forceEncoding&lt;/param-name&gt; <br>&lt;param-value&gt;true&lt;/param-value&gt; <br>&lt;/init-param&gt; <br>&lt;/filter&gt; </p>
<p>&lt;filter-mapping&gt; <br>&lt;filter-name&gt;encodingFilter&lt;/filter-name&gt; <br>&lt;url-pattern&gt;*.html&lt;/url-pattern&gt; <br>&lt;/filter-mapping&gt; <br>&lt;filter-mapping&gt; <br>&lt;filter-name&gt;encodingFilter&lt;/filter-name&gt; <br>&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt; <br>&lt;/filter-mapping&gt; </p>
<p>因为规范要求浏览器提交数据都要用utf8编码,所以这里设置编码方式为UTF8. </p>
<p>特别注意: <br>a,这个过滤器只是简单的调用:request.setCharacterEncoding(this.encoding); <br>在这个语句之前不能调用任何的request.getParameter()方法,否则会设置tomcat的缺省字符集为"ISO-8859-1",并且使setCharacterEncoding的调用失效.所以在这个过滤器之前的过滤器中不能有对getParameter这类方法的调用,比较安全的做法就是把这个过滤器尽量靠前放. <br>b,在server.xml中不能加上&lt;Valve className="org.apache.catalina.valves.RequestDumperValve"/&gt; <br>这个value也设置tomcat的缺省字符集为"ISO-8859-1",使setCharacterEncoding的调用失效.可能其他的value也有这个问题,我没有测试过. <br>如果要观察http请求参数,可以考虑用过滤器或者其他工具,例如ethereal(<a href="http://www.ethereal.com/">http://www.ethereal.com/</a>) </p>
<p>2,get提交的数据: <br>两种情况: <br>a,如果从地址栏直接输入汉字,则一般编码为"GBK",需要用 <br>new String(request.getParameter("something").getBytes("ISO-8859-1"),"GBK") <br>取出 <br>b,如果是页面超连接连接中带的汉字,则编码根据页面编码的不同而不同,如果页面的 <br>content="text/html; charset=utf-8",则在tomcat/conf/server.xml中的配置文件中: <br>&lt;!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 --&gt; <br>&lt;Connector port="8080" <br>maxThreads="150" minSpareThreads="25" maxSpareThreads="75" <br>enableLookups="false" redirectPort="8443" acceptCount="100" <br>debug="0" connectionTimeout="20000" useBodyEncodingForURI="true" <br>disableUploadTimeout="true" /&gt; </p>
<p>加上:useBodyEncodingForURI="true"即可正常使用getParameter取出正确内容. <br>如果content="text/html; charset=GBK",需用 <br>new String(request.getParameter("something").getBytes("ISO-8859-1"),"GBK") <br>取出,其他情况类似. </p>
<p>总结: <br>1,所有页面使用utf8编码, <br>2,服务器加上过滤器, <br>3,server.xml中不要使用 <br>&lt;Valve className="org.apache.catalina.valves.RequestDumperValve"/&gt; <br>4,server.xml文件加上useBodyEncodingForURI="true" <br>这样应该可以搞定大多数前台的中文问题.至于地址栏输入中文,不支持也罢,一般的程序很少要求 <br>从这里输入.</p>
<p>&nbsp; 第六，连接数据库 </p>
<p>1、mysql配置文件：<br>修改mysql在windows\my.ini里default-character-set=utf-8</p>
<p>2、mysql里数据库和表也都设为utf8_unicode_ci</p>
<p>3、数据库连结：jdbc:mysql://localhost/mydb?useUnicode=true&amp;characterEncoding=utf-8<br>注意，关键就在于此：此句中间是'&amp;'不是'&amp;'这是因为数据库连结时，在.jsp和.java文件中应该用&amp;号，而XML文件中需要用&amp;<br></p>
<img src ="http://www.blogjava.net/merek/aggbug/112904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/merek/" target="_blank">小麦</a> 2007-04-23 11:16 <a href="http://www.blogjava.net/merek/articles/112904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>