2010-10-09 103 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