tomcat+JSP亂碼解決
環境:tomcat5.5,
1. tomcat編碼轉換原則
所有頁面、數據庫、存取文件都應採用統一的編碼,否則在處理過程中需要進行編碼轉換。在此統一編碼假定爲UTF-8,其它編碼類似。
圖表 1tomcat編碼轉換
默認情況下tomcat是按ISO-8859-1編碼來處理數據的,所有傳給tomcat的數據都會被轉換爲ISO-8859-1編碼,而從tomcat中得到的也是以ISO-8859-1編碼的數據。因此,在JSP代碼從服務器獲取客戶端傳遞來的參數時,必須將參數編碼從ISO-8859-1轉爲UTF-8。
2. 具體處理方式
各種編碼名稱:
http://www.iana.org/assignments/character-sets/character-sets.xml
2.1. 通用方法
String s = request.getParameter(“...”); String str= new String(s.getBytes("ISO-8859-1"),"UTF-8");
該方法過於繁瑣,需要對每次得到的參數進行單獨的轉碼。
2.2. 處理POST提交的數據
2.2.1. 方法一:
必須在第一次獲取參數之前調用request.setCharacterEncoding(“UTF-8”);
注意:這個語句之前不能調用任何的request.getParameter()方法,否則會設置tomcat的缺省字符集爲"ISO-8859-1",並且使setCharacterEncoding的調用失效。
2.2.2. 方法二:
如果使用了spring框架,則可以在server.xml中使用
org.springframework.web.filter.CharacterEncodingFilter過濾器:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
注意:個過濾器之前的過濾器中不能有對getParameter這類方法的調用,比較安全的做法就是把這個過濾器儘量靠前放.
2.3. 處理GET提交的參數
2.3.1. 修改URI編碼
在這個目錄下:Apache Software Foundation\Tomcat 6.0\conf的server.xml文件中,找到
<Connector port="8888" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- A "Connector" using the shared thread pool-->
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
然後修改如下: <Connector port="8888" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
<!-- A "Connector" using the shared thread pool-->
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
注:對於tomcat5.0只需要修改第一個Connector就可以了。
有個地方說是在Connector中添上useBodyEncodingForURI="true",但我試了一下,不行。
3. 編碼設置
3.1. *.jsp文件
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" language="java" %>
contentType="text/html; charset=UTF-8":用於指定瀏覽器以UTF-8編碼來解釋網頁。
pageEncoding="UTF-8" :說明該jsp文件的編碼類型,必須與文件編碼類型一致(在eclipse中會據此將文件保存爲該類型,而不管eclipse當時的encoding是什麼)。此外,tomcat會據此讀取jsp文件並轉化爲servlet存爲系統默認編碼。
3.2. mysql數據庫
1、mysql配置文件:修改mysql在windows\my.ini裏default-character-set=utf-8
2、mysql裏數據庫和表也都設爲utf8_unicode_ci
3、數據庫連結:jdbc:mysql://localhost/mydb?useUnicode=true&characterEncoding=utf-8
參考
http://www.blogjava.net/caizh2009/articles/309193.html
http://xinbupo.blog.163.com/blog/static/157566605201241684656283/