2009-02-07 74 views
1

我有一個奇怪的編碼情況,即html頁面本身顯示爲它應該(所有accénted字符正確顯示),但所有彈出dojo對話框無法使用正確編碼。編碼「主」頁面和dojo對話框之間的差異

下面是設置:

  • 與Tomcat6.0.18運行休眠/彈簧/ Struts2的的Java Web項目;頁面生成爲JSP tile,由Tiles2組裝在一起。
  • 所有的源文件都是UTF-8編碼,,除了用於ISO-8859-1(按照Java規範)的資源屬性文件(*.properties)。
  • 數據庫採用UTF-8編碼。
  • struts.xml包含常量的定義:

    <constant name="struts.i18n.encoding" value="UTF-8"/> 
    
  • 每個JSP瓦的聲明

    <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> 
    
  • 每一個JSP頁面(幾個瓦片構成)開始啓動與聲明

    <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> 
    <?xml version="1.0" encoding="UTF-8"?> 
    
  • 每個HTML頁面生成從JSP代碼d包含以下<head>元標記:

    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/> 
    
  • 一個Tomcat編碼過濾器設置報頭every single request going through Tomcat爲值:

    text/html;charset=UTF-8 
    
  • 道場1.2.3上的每個被初始化用語句頁面

    <script type="text/javascript" src="/scripts/dojo/dojo/dojo.js" djConfig="parseOnLoad:true,usePlainJson:true,locale:'fr'"></script> 
    
  • 一個dijit.Dialog首先創建,然後通過開下面的語句(在/votingOptions動作URL返回遵循同樣規格的前一個JSP片斷---即JSP片斷結束嵌入對話框<div>內):

    dialog = new dijit.Dialog({title:"My title",loadingMessage:"Loading..."}); 
    dialog.setHref('/votingOptions'); 
    dialog.show(); 
    

結果在所有設置中,所有「常規」頁面(即擱置dojo對話框)都會顯示所有字符,重音和所有字符,無論文本來自數據庫還是來自資源文件。

另一方面,任何dojo對話框的內容都會變形:所有非重音字符都可以,但重音字符的顯示方式與正在嘗試讀取UTF-8字符的重音字符顯示爲ISO-8859- 1個(不管這些字符來自數據庫還是來自資源文件)。

因此,例如,名稱爲「哥德爾」(因爲它會正確顯示在主頁上)將在道場對話框中顯示爲「庫爾特Gödel」!

注意,螢火報告在這兩種情況下送達的Tomcat相同的響應報頭(是否調用主網頁,或者,一旦在頁面上,打開一個道場對話框):

Server: Apache/2.2.3 (CentOS) 
Content-Language: en-US 
Connection: close 
Content-Type: text/html;charset=UTF-8 

之間的唯一區別這兩種類型的請求(除了內容長度)爲:

Transfer-Encoding: chunked 

請求的主網頁但在道場-對話框的情況下不存在時,其存在。

任何人都可以判斷到目前爲止我逃脫了什麼?或者,對於我應該執行的這種偵查來說,建議是值得歡迎的!

回答

0

Dojo中的Dialog小部件調用URL/votingOptions,我認爲這是通過servlet或Struts操作處理的。

因爲這是一個Ajax調用,我還假設如果您使用的是struts動作,那麼您通過HttpServletResponse對象發送響應,而不是重定向到視圖。

無論哪種方式,請務必使用:代替

String str = "こんにちわ、 Kürt Gödel"; 
response.getWriter().write(str); 

response.getOutputStream().println(str); 

我能夠重現您與這些作品的代碼正在經歷的行爲。第一個顯示所有字符正確(即使是日本的!),第二個顯示一個亂碼。

由於您正在開發Ajax應用程序,因此請確保安裝HttpFox插件,該插件比Firebug更能顯示Http流量。

0

我有類似的問題。
在我的情況下,在ISO-8859-1格式返回的道場JavaScript文件。爲了解決它,我不得不在默認的FilterDispatcher類中重寫方法getContentType()。我將其替換爲以下代碼(在Struts 2.0.9中進行了測試):


protected String getContentType(String name) { 
     if (name.endsWith(".js")) { 
      return "text/javascript;charset=\"UTF-8\""; 
     } else if (name.endsWith(".css")) { 
      return "text/css"; 
     } else if (name.endsWith(".html")) { 
      return "text/html;charset=\"UTF-8\""; 
     } else if (name.endsWith(".txt")) { 
      return "text/plain"; 
     } else if (name.endsWith(".gif")) { 
      return "image/gif"; 
     } else if (name.endsWith(".jpg") || name.endsWith(".jpeg")) { 
      return "image/jpeg"; 
     } else if (name.endsWith(".png")) { 
      return "image/png"; 
     } else { 
      return null; 
     } 
} 
相關問題