字符编码问题春天

时间:2010-06-17 18:51:41

标签: spring tomcat character-encoding

我在网站上遇到编码的大问题! 我使用spring 3,tomcat 6和mysql db。我想在我的网站上支持德语和捷克语以及英语,我将所有JSP创建为UTF-8文件,并在每个jsp中包含以下内容:

<%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

我创建了messages.properties(默认为捷克语),messages_de.properties和messages_en.properties。所有这些都保存为UTF-8文件。

我在web.xml中添加了以下内容:

<filter>
    <filter-name>encodingFilter</filter-name>
    <filterclass>
          org.springframework.web.filter.CharacterEncodingFilter</filterclass>
    <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>

 <locale-encoding-mapping-list>
    <locale-encoding-mapping>
        <locale>en</locale>
        <encoding>UTF-8</encoding>
    </locale-encoding-mapping>
    <locale-encoding-mapping>
        <locale>cz</locale>
        <encoding>UTF-8</encoding>
    </locale-encoding-mapping>
    <locale-encoding-mapping>
        <locale>de</locale>
        <encoding>UTF-8</encoding>
    </locale-encoding-mapping>
</locale-encoding-mapping-list>

 <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
 </filter-mapping>  

并将以下内容添加到我的applicationContext.xml:

<bean id="messageSource"    
    class="org.springframework.context.support.ResourceBundleMessageSource"
    p:basenames="messages"/>

<!-- Declare the Interceptor -->
<mvc:interceptors>    
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"
          p:paramName="locale" />
</mvc:interceptors>

<!-- Declare the Resolver -->
<bean id="localeResolver"  
       class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />

我在server.xml的元素中将useBodyEncodingForURI属性设置为true:%CATALINA_HOME%/ conf,另一次尝试添加URIEncoding =“UTF-8”。

我使用charset [utf8]和集合[utf8_general_ci]

创建了所有表和字段

我的浏览器中的编码是UTF-8(BTW,我有IE8和Firefox 3.6.3)

当我打开MYSQL查询浏览器并手动插入捷克语或德语数据时,它正确插入,并在我的应用程序中正确显示。

所以,这是我遇到的问题列表:

  1. 默认情况下应加载messages.properties(捷克语),而默认情况下会加载messages_en.properties。

  2. 在网络表单中,当我输入捷克数据时,然后单击提交,在控制器中我打印出控制台中的数据,然后将其保存到数据库,打印的内容不正确有奇怪的字符,以及这是保存到db的确切数据。

  3. 我不知道哪里出错了!为什么我不能让它工作,虽然我做了人们为他们所做的工作!不知道......

    请帮助我,我几天都陷入了这个糟糕的问题,它让我发疯了!

    提前谢谢。

3 个答案:

答案 0 :(得分:14)

首先,如果您的项目使用Maven,请确保Maven Resources Plugin has UTF-8 set as its character encoding scheme,否则可能会使用不正确的编码将邮件属性文件写入目标。

其次,你正在使用 ResourceBundleMessageSource ,它使用标准的 java.util.ResourceBundle java.util.Properties ,支持ISO-8859-1编码。您可以改为使用 ReloadableResourceBundleMessageSource

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
         <property name="basename" value="classpath:messages"/>
         <property name="defaultEncoding" value="UTF-8"/>
</bean>

我是从this Cake Solutions博客文章中发现的。

答案 1 :(得分:3)

如果这仍然无效并且您使用Tomcat作为应用程序服务器,请尝试在<Connector>中的每个server.xml元素上设置以下选项:

<Connector URIEncoding="UTF-8" ...>
    ...
</Connector>

这对我有用。其他应用程序服务器可能有类似的选项,因此您可能需要检查服务器文档。

答案 2 :(得分:2)

  

1:默认情况下应加载messages.properties(Czech),而默认情况下会加载messages_en.properties。

我不做春天,所以这是在黑暗中拍摄:也许是因为英语是先订购和/或你的平台/浏览器使用英语作为默认语言环境?重新排列配置并检查HTTP请求标头中的accept-language以排除其中一个。

  

2:在网络表单中,当我输入捷克数据时,然后单击提交,在控制器中我打印出控制台中的数据,然后将其保存到数据库,打印的内容不正确有奇怪的字符,这个是保存到db的确切数据。

控制台是否配置为使用UTF-8显示数据?否则它将使用平台默认编码。在例如Eclipse中,您可以通过 Window&gt;来配置它。偏好&gt;一般&gt;工作区&gt;文本文件编码

是否正确配置了数据访问层以将数据处理为UTF-8?众所周知,MySQL JDBC驱动程序在这方面有点不聪明。它不会使用DB指定的编码,而是使用客户端平台的默认编码。到目前为止,您希望在JDBC连接字符串中使用useUnicode=truecharacterEncoding=UTF-8属性。 E.g。

jdbc:mysql://localhost/some_db?useUnicode=yes&characterEncoding=UTF-8