2010-06-17 22 views
13

我在我的網站編碼存在一個大問題! 我使用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" /> 

我設置useBodyEncodingForURI屬性爲true,服務器的元素。 xml在%CATALINA_HOME%/ conf下,另一次嘗試添加URIEncoding =「UTF-8」。

我創建了所有的表和字段與字符集[UTF-8]和集合[utf8_general_ci]

在瀏覽器中的編碼是UTF-8(順便說一句,我有IE8和Firefox 3.6.3)

當我打開MYSQL Query瀏覽器並手動插入捷克語或德語數據時,它正確插入,並且正確顯示在我的應用程序中。

所以,這裏的問題的名單上有:

  1. 默認情況下,messages.properties(捷克)應該被默認加載,而不是messages_en.properties負荷。

  2. 在Web表單,當我進入捷克的數據,然後點擊提交,在控制器我打印出控制檯中的數據之前將其保存到數據庫,什麼正在印刷是不正確的有奇怪的字符,這是保存到數據庫的確切數據。

我不知道錯在哪裏!爲什麼我不能讓它工作,雖然我做了人們爲他們做的工作!不知道..

請幫助我,我被困在這個蹩腳的問題,因爲天,它讓我瘋狂!

預先感謝您。

回答

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蛋糕解決方案博客中發現的。

+0

這是Silver Bullet :-) – user256872 2010-06-24 09:40:51

+0

我在Spring應用程序中嘗試這個,但沒有成功。 – 2016-06-09 02:39:54

2

1:默認情況下應該加載messages.properties(捷克語),而不是默認加載messages_en.properties。

我不會做春天,所以這裏是在黑暗中拍攝的:也許是因爲英文是首先定購的和/或您的平臺/瀏覽器使用英語作爲默認語言環境?重新排列配置並在HTTP請求頭中檢查accept-language以排除其中一個。

2:在Web表單,當我進入捷克的數據,然後點擊提交,在控制器我在控制檯打印出數據之前將其保存到數據庫,什麼正在印刷是不正確的有奇怪的字符,這是保存到數據庫的確切數據。

控制檯是否配置爲使用UTF-8顯示數據?否則它將使用平臺默認編碼。例如在Eclipse中,您可以通過窗口>首選項>常規>工作區>文本文件編碼進行配置。

數據訪問層是否正確配置爲以UTF-8格式處理數據?已知MySQL JDBC驅動程序在這方面有點不聰明。它不會使用DB指定的編碼,而是使用客戶端平臺的默認編碼。至此,您想要在JDBC連接字符串中使用useUnicode=truecharacterEncoding=UTF-8屬性。例如。

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

感謝您的建議,關於第一點,我使用了CoockieLocaleResolver表單彈簧,它將爲以後的時間保存用戶首選項。 #2。你是對的,控制檯的問題是通過eclipse將文本文件編碼設置爲URF-8來解決的,但是仍然存儲在數據庫中的數據被破壞了! 問題列表#3的問題是,從messages_cz.properties檢索到的數據在網頁中無法正確顯示,它總是被損壞!儘管頁面編碼是UTF-8! – user256872 2010-06-24 09:15:10

3

如果仍然不工作,你使用Tomcat作爲應用服務器嘗試在server.xml<Connector>元素上設置以下選項:

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

這奏效了我。其他應用程序服務器可能有類似的選項,因此您可能需要檢查服務器文檔。