【问题标题】:Unicode characters are being saved incorrectlyUnicode 字符保存不正确
【发布时间】:2011-04-16 12:37:48
【问题描述】:

我有一个 mysql 数据库,其中包含 unicode 文本字符串。我的 JSF 应用程序(在 tomcat 6 上运行)可以读取这些 un​​icode 字符串并在浏览器中正确显示它们。所有 html 字符集都设置为 UTF-8。

当我保存我的对象时,即使没有进行任何更改,Hibernate 也会将它持久化回数据库。如果我现在直接查看数据库,我会发现带有重音符号的字符已成为垃圾。

我的数据库连接字符串是:

        <property name="hibernate.connection.url"
                  value="jdbc:mysql://database.address.com/dbname?autoReconnect=true&#38;zeroDateTimeBehavior=convertToNull&#38;useUnicode=true&#38;characterEncoding=utf8"/>

将 characterEncoding 更改为 UTF-8 而不是 utf8 没有任何区别。

实际上,它肯定是在工作日前,但现在不是,我不知道要检查什么。你有什么建议吗?我可以提供任何被认为相关的进一步信息。

【问题讨论】:

    标签: mysql hibernate jsf unicode jdbc


    【解决方案1】:

    它只发生在某些桌子上吗?也许这些表的默认字符集与其他表不同。 (http://dev.mysql.com/doc/refman/5.1/en/charset-table.html)

    【讨论】:

      【解决方案2】:

      我想到了一些解决方案:

      • 如果使用 facelets,请在页面顶部指定 &lt;?xml version="1.0" encoding="UTF-8"?&gt;
      • 如果使用JSP,指定&lt;%@ page pageEncoding="utf-8" %&gt;
      • 如果这不起作用,请创建一个映射到 faces servlet 的过滤器,然后执行request.setCharacterEncoding("utf-8")

      【讨论】:

        【解决方案3】:

        我和你有同样的问题,但使用的是 PostgreSQL。您可以使用如下过滤器。它对我有用。我认为它必须是更好的解决方案,但我还没有找到:/

        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;
        
        public class UnicodeFilter implements Filter {
        
            @Override
            public void destroy() {}
        
            @Override
            public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
                 // Set the characterencoding for the request and response streams.  
                 req.setCharacterEncoding("UTF-8");  
                 res.setContentType("text/html; charset=UTF-8");          
                 chain.doFilter(req, res);    
            }  
        
            @Override
            public void init(FilterConfig arg0) throws ServletException {}
        
        }
        

        在 web.xml 中:

        <filter>
                <filter-name>utffilter</filter-name>
                <filter-class>utils.UnicodeFilter</filter-class>
        </filter>
        <filter-mapping>
                <filter-name>utffilter</filter-name>
                <url-pattern>/*</url-pattern>
        </filter-mapping>
        

        【讨论】:

        • 删除res.setContentType(),它的弊大于利。 req.setCharacterEncoding() 已由 Bozho 推荐。有关更多详细信息和解决方案,另请参阅this article
        【解决方案4】:

        Spring 中,我发现一个最简单的解决方案是CharacterEncodingFilter

         <filter>
             <filter-name>encoding-filter</filter-name>
             <filter-class>
                 org.springframework.web.filter.CharacterEncodingFilter
             </filter-class>
             <init-param>
                 <param-name>encoding</param-name>
                 <param-value>UTF-8</param-value>
             </init-param>
         </filter>
         <filter-mapping>
             <filter-name>encoding-filter</filter-name>
             <url-pattern>/*</url-pattern>
         </filter-mapping>
        

        【讨论】:

        • 这基本上只是request.setCharacterEncoding("UTF-8"),仅此而已。
        【解决方案5】:

        确保使用 UTF-8 编码的页面,以便显示某些字符 并正确提交...

        将此过滤器添加到 web.xml。

        <filter>
            <filter-name>encodingFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</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>/*</url-pattern>
        </filter-mapping>
        

        【讨论】:

          猜你喜欢
          • 2017-04-11
          • 1970-01-01
          • 2017-06-14
          • 1970-01-01
          • 2021-12-06
          • 2019-03-08
          • 2012-01-23
          • 2012-02-09
          • 2021-09-25
          相关资源
          最近更新 更多