2010-10-09 105 views
2

我有一個web應用程序,從用戶收集一些數據並將它們保存到mysql數據庫。問題是,對於像「Ajánlatkiküldése」這樣的字符串,存儲到數據庫的是「Ajânlatkiküldése」。struts,休眠,mysql - 字符編碼問題

對於我的數據庫,我有DEFAULT CHARACTER SET utf8。對於我的表,我有DEFAULT CHARSET = utf8。

在我的hibernate.cfg.xml我有:

<property name="hibernate.connection.useUnicode">true</property> 
<property name="hibernate.connection.characterEncoding">UTF-8</property> 
<property name="hibernate.connection.charSet">UTF-8</property> 

如果我使用MySQL客戶端輸入「Ajánlatkiküldése」直接進入數據庫,文本被正確保存。因此,在我的應用程序內部的某處,文本發生了變化。

我有這個在我的JSPX頁:

<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/> 

對於我的形式我用sutrts html標記庫,代碼很簡單:

<html:form action="/submitAddProject"> 
      <table> 
       <tr> 
        <td>name</td> 
        <td> 
         <html:text property="projectNameToAdd"/> 
        <td> 
       etc. 

在提交時,當我做myForm.getProjectNameToAdd ,我的文本與我在表單中輸入的不同。 (Ajánlatkiküldé本身,而不是Ajánlatkiküldése)

+0

一兩件事:當我在數據庫中手動輸入的文本,它被正確地在我的應用程序中顯示。該問題僅在保存文本時出現。 – Mihaela 2010-10-09 08:15:14

+0

在我保存到數據庫之前,當我在我的字符串字段上調用getter來產生問題時,我已經以錯誤的編碼獲取了文本。所以,當我嘗試保存到數據庫時,問題並非如此,但是當我的表單對象的字段正在從html頁面填充時,更確切地說,由stter接收的字符串已經扭曲,並且與輸入的字符串不同在文本字段中。 – Mihaela 2010-10-09 08:42:05

+0

你使用任何連接池framewrok? – fmucar 2011-02-14 09:48:09

回答

1

您可以嘗試創建以下過濾器:

public class Utf8EncodingFilter implements Filter { 

public void init(FilterConfig config) throws ServletException {} 

public void doFilter(ServletRequest request, ServletResponse response, FilterChain next) 
throws IOException, ServletException { 
    request.setCharacterEncoding("utf-8"); 
    next.doFilter(request, response); 
} 

public void destroy(){} 
} 

UPDATE: 您需要創建Utf8EncodingFilter類,進口過濾器接口,異常,等等。 (任何現代IDE都會爲你做這件事)。然後,你需要這個過濾器添加到您的部署描述符(可在WEB-INF/web.xml中找到)使用的語法如下:

<filter> 
    <filter-name>UTF-8 Encoding Filter</filter-name> 
    <filter-class>com.example.Utf8EncodingFilter</filter-class> 
    </filter> 

    <filter-mapping> 
    <filter-name>UTF-8 Encoding Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 

你可以閱讀更多有關過濾器的位置:http://www.ibm.com/developerworks/java/library/j-pj2ee10.html

+0

Sry,但我應該如何使用這個類?在哪裏放? :)在struts中,有一個名爲controller的servlet,我認爲它爲我的表單對象調用reset和setter。當調用者被調用時,它已經收到錯誤的字符編碼。所以,表單有很好的數據,setter接收不好的數據。有人在某處扭曲數據。 – Mihaela 2010-10-09 08:55:34

+0

您需要創建Utf8EncodingFilter類,導入Filter接口,異常等(任何現代IDE都會爲您執行此操作)。然後,您需要使用以下語法將此過濾器添加到部署描述符(可在WEB-INF/web.xml中找到): – Roman 2010-10-09 09:02:47

+0

不,語法丟失:)請重試。堆棧溢出編輯有點奇怪:) – Mihaela 2010-10-09 09:04:14

2

我有一個類似的問題,但我的問題直接與休眠保存MySQL中的數據。通過在配置文件中將連接字符串附加useUnicode = true & characterEncoding = UTF-8,可以輕鬆解決該問題。

例如:jdbc.databaseurl = JDBC:MySQL的://本地主機:3306/myHibernateDB了useUnicode =真&的characterEncoding = UTF-8

爲我工作像一塊魔法。

這是談論它的文章:http://www.isocra.com/2007/01/utf-8-with-hibernate-30-and-mysql/

+0

謝謝兄弟,你是一個拯救生命的人! – ye9ane 2013-12-17 07:29:09