【问题标题】:Spring 3 MVC: How to store € symbol from form?Spring 3 MVC:如何从表单中存储€符号?
【发布时间】:2010-07-12 12:22:13
【问题描述】:

我使用 Spring 3 MVC 和 MySQL 5 作为我的数据库。

我使用 Spring 表单标签创建了一个表单,用于更新我的数据库中的对象。

我在此表单的一个文本输入字段中输入“票价:35 欧元”并保存该项目。然后,当我在显示页面中查看该项目时,文本显示为“门票价格:?35”。

如果我使用 MySql 查询浏览器直接在数据库中输入“Ticket price: €35”,那么欧元符号会通过显示页面正常显示。

我需要做什么才能让我的 Spring 表单将欧元符号正确保存到数据库中?


更新

您好,Bozho,我尝试了您的建议,但没有成功。我的 web.xml 如下所示:

<filter>
    <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>




<servlet>
    <servlet-name>baseApp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>baseApp</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

还有什么想法吗?

【问题讨论】:

    标签: java spring spring-mvc character-encoding


    【解决方案1】:

    使用 spring 字符编码过滤器。在web.xml

    <filter>
        <filter-name>CharacterEncodingFilter</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>
    

    并将其映射到默认的 servlet

    然后,您的 MySQL 连接字符串应如下所示:

    jdbc:mysql://localhost/dbName?characterEncoding=utf8
    

    【讨论】:

    • 您好,感谢您的回答。我已尝试添加此过滤器,但不幸的是我仍然遇到同样的问题,欧元符号显示为问号。还有什么想法吗?
    • 如果你仍然有同样的问题,那么你的 JDBC/DB 东西仍然没有将 char 保存为 UTF-8。尝试将useUnicode=yes 添加到连接字符串。 MySQL 在这方面有些奇怪。
    • 太好了,我现在已经对我的数据源 URL 以及之前对 web.xml 的更改进行了上述更改。现在,当我使用 € 保存表单时,出现异常: ERROR org.hibernate.util.JDBCExceptionReporter - Data truncation: Data truncated for column 'description' at row 1 。 'description' 是我输入 € 的字段,它的 MySQL 数据类型为 TEXT。关于我为什么会收到此异常的任何想法?
    • 也许您的专栏没有足够的长度?
    • 我不确定列的长度是否存在问题。该列的类型为 TEXT,我输入的唯一值是 €,即只有单个字符...奇怪。
    【解决方案2】:

    您必须确保包含 € 的字符串的编码设置为正确的编码(与您的表相同)。我建议使用 UTF-8

    【讨论】:

    • -1。 Java 中所有 String 的内部表示是 UTF-16。他需要的是一个正确的转换链——从页面编码到 UTF-16(由CharacterEncodingFilter 执行)和从 UTF-16 到数据库编码(由 JDBC 驱动程序执行)。
    • 不管他是先把他的字符串的编码设置为UTF-16,然后通过JDBC将其转换为数据库编码,还是从网页将其转换为UTF-8,然后JDBC 不必进行任何进一步的转换,还是我错过了什么?
    • 是的,你有。再次阅读@axtavt 的答案......仔细。所有 Java 字符串都是 UTF-16。期间。
    • 我不同意 - 抱歉:您可以将 java 中的字符串编码设置为任何编码。我不在乎 java 的最深内部是否将其重新编码为 UTF-16,当我使用该字符串时,它会自动为我将其重新编码回 UTF-8。但是可以将字符串的编码定义为 UTF-8 并使用它。参见:java.nio.charset.CharsetEncoder
    猜你喜欢
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2013-05-27
    相关资源
    最近更新 更多