1. 程式人生 > >Struts+Hibernate+MyEclipse+Tomcat+MySQL的亂碼之解決

Struts+Hibernate+MyEclipse+Tomcat+MySQL的亂碼之解決

Struts+Hibernate+MyEclipse+Tomcat+MySQL的亂碼之解決篇[zz]

關鍵字:Struts Hibernate MyEclipse Tomcat MySQL JSP 亂碼編碼出錯內碼設定經過幾天的努力,參照諸多兄臺的點拔,再加本人的細細品味之後,方知此茶乃良茶,苦盡甘來矣。好,廢話不多說,下面談正題!在系統中出現亂碼一般是編碼設定和編碼轉換問題,那麼我們來看看當中有多少編碼設定和編碼轉換的呢?顯示介面,JSP 2.0      

JAVA
容器:
Tomcat 5.X

MVC
構架:
Struts 1.2

ORM
工具:
Hibernate 3

資料庫:
MySQL   5.0

編譯IDEMyEclipse 5.0



知道了有六個地方要設定編碼,那麼哪種編碼最好呢?使用中文可以GBK,但我認為UTF-8會是更好的選擇,如果想知道了解編碼的更多細節,請訪問:
計算機編碼大全-A

計算機編碼大全
-B



好現在選定UTF-8,在上面的這六個地方一一設定吧:
顯示介面,JSP

      
在頁面的開頭加入或修改成:<%@ page language="java" pageEncoding="utf-8"%> 紅色部分為要設定部分。




JAVA
容器:
Tomcat

      
本人蔘照某兄臺的之作:Tomcat中文編碼問題解決方案() 有興趣可以進去看看。
下面開始設定,在
Tomcat安裝目錄下的conf檔案開啟Server.xml檔案,找到相應段落並更改成以下字樣:


       <Connector port="8080" maxThreads="150" minSpareThreads="25"

maxSpareThreads="75" enableLookups="false" redirectPort="8443"

acceptCount="100" debug="0" c

        disableUploadTimeout="true"  URIEncoding="utf-8"/>

      
紅色部分為要設定部分。




MVC
構架:
Struts

      
在這裡新增一個字符集的Fliter,程式碼如下:


package com.ruder.filters;

//
上面的包名錶示你把這個Fliter檔案放在哪個包中,在下面的Web.xml也要相應改動。

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.UnavailableException;
public class SetCharacterEncodingFilter implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig = null;
protected boolean ignore = true;
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
// Conditionally select and set the character encoding to be used
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
// Pass control on to the next filter
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;
}
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}

下面是對Web.xml
</servlet-mapping>下的的置:<filter>

<filter-name>Set Character Encoding</filter-name>

<filter-class>

com.ruder.filters.SetCharacterEncodingFilter

</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>utf-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>Set Character Encoding</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>


                  
4.
提交表單的jsp頁面設定
<%@ page language="java"  c%>




至此問題已經解決,但是還有一些我們應該瞭解的,下面我簡述一下
:

為每個jsp頁面設定了其編碼格式(utf-8),但傳遞資料到另一頁面時依然顯示為亂碼?  首先要需要了解的是web容器預設編碼是iso-8859-1,一個漢字佔用兩個位元組,而在utf-8中一個漢字佔用三個位元組。所以在資料傳遞過程中,必須手動設定容器編碼格式,否則會出現字元位丟失的情況。即3個位元組變為兩個位元組,自然會變成亂碼。為什麼儲存到資料庫中的資料都變成了亂碼?  原理同上,首先要搞清楚使用的資料庫預設的編碼格式,比如mysql預設的字元編碼是ISO-8859-1。所以必須手動修改其預設編碼格式。  清楚了以上問題後,再來看如何解決utf-8的亂碼問題。
1.設定web容器的編碼格式。為你的servletdoGetdoPost方法開始處加入如下程式碼:request.setCharacterEncoding("utf-8");   response.setCharacterEncoding ("utf-8");

2.為每個jsp頁面指定其編碼格式。
<%@ page pageEncoding="utf-8"%>

3.在連線資料庫用的URL後加入:useUnicode=true; characterEncoding=utf-8 如: 
url="jdbc:mysql:///db1?useUnicode=true; characterEncoding=utf-8"

4.為指定資料庫預設編碼格式。在C:/WINDOWS目錄下找到my.ini檔案,並在 [mysqld]中加入default-character-set=gbk,重新啟動mysql服務。 
至此,亂碼問題全部解決。起初總搞上去不清,為什麼要將mysql的預設編碼格式設定為gbk,後來由相關的資料得知utf-8預設輸入編碼方式為gbk,預設輸出編碼方式為utf-16be。  個人認為,將資料進行utf-8進行編碼的目的(即將中文編碼為%的形式),主要是為了在多層服務間進行資料傳輸時,防止發生字元丟失(msn)。普通的web程式顯然沒有必要這樣做,只要使用以上方法進行處理,就可以有效的解決亂碼問題,從而結省儲存空間。如果都像公司的SC系統那樣,將一個漢字編碼為18個字元後,再儲存到資料庫中,拋開效率不說,就儲存空間的浪費就夠人受的,要知道,那是需要銀子地!