其實以下總結適合於任何hibernate+mysql的情況;
步驟1:在建立資料庫Schema的時候請指定編碼,例如mysql,就用這樣的語句來建立Schema:
Sql代碼
create schema xxxx default character set utf8;
這一步必須這樣,因為至少我在網上還沒找到hbm2ddl的配置方法使得hibernate產生的資料庫表的編碼能被指定,那麼為schema設定一個預設的編碼就是最簡便的方法;當然,你也可以不在schema上設定預設編碼,等到hibernate產生表之後,在一個一個表地去改編碼。具體可查閱資料庫協助文檔。
“步驟1”得不到確認的話,下面的步驟可以忽略;
步驟2:在工程中的每一個頁面,設定meta資訊
Html代碼
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
這個不多解釋了,設定了這個後,起碼你的頁面能“容得下”中文了。這一步建議在模板技術裡解決,在最外層的模板裡加上這個meta就行了,不用每個頁面都加。
至此,你會發現直接寫死在頁面上的中文沒問題;直接用資料庫管理用戶端的console插入的中文也沒問題;就是經由程式插入的中文資料有問題;那麼:
步驟3:指定資料庫連接url的參數,例:
Xml代碼
jdbc:mysql://localhost:3306/data115?useUnicode=true&characterEncoding=utf-8
這樣,經由程式插入的資料應該也能行了。
最後,有時候需要用GET方式在url的參數裡傳中文,url裡的中文是需要被編碼之後才能傳的,像tomcat預設的uriEncoding是iso-8859-1,這會導致經由url傳過來的中文值變亂碼;這就需要在server.xml的connector節點裡配置“URIEncoding='UTF-8'”,例如:
Xml代碼
<Connector port="8080" address="${jboss.bind.address}"
maxThreads="250" maxHttpHeaderSize="8192"
emptySessionPath="true" protocol="HTTP/1.1"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding='UTF-8'/>
我這個是jboss的,server.xml位置在deploy/jboss-web.deployer下,tomcat的話很好找了,配置起來都一樣。
最最後,你是不是認為還有一招“filter”的方式?以前用過一段時間struts的時候filter很管用,但現在我在seam下實驗過後發覺有沒有這個filter都沒關係,只要確認上述4步驟那麼亂碼應該就能解決了;我估計如果架構程式裡沒有寫入程式碼使用非UTF-8的字元集來encode的話都用不著filter.