1

私は奇妙なエンコーディング状況を抱えており、HTML ページ自体は (すべてのアクセント付き文字が適切に表示されて) 本来のように表示されますが、すべてのポップアップ Dojo ダイアログは正しいエンコーディングを使用できません。

セットアップは次のとおりです。

  • Tomcat6.0.18 で実行されている Hibernate/Spring/Struts2 を使用した Java Web プロジェクト。ページは、Tiles2 によってまとめられた JSP タイルとして生成されます。
  • すべてのソース ファイルは、ISO-8859-1 (Java 仕様による) にあるリソース プロパティ ファイル ( ) を除いて、UTF-8 でエンコードされています。*.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"?>
    
  • JSP コードから生成された各 HTML ページには、次の<head>メタタグが含まれています。

    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
    
  • Tomcat エンコーディング フィルタは、のヘッダーをevery single request going through Tomcat次の値に設定します。

    text/html;charset=UTF-8
    
  • dojo 1.2.3 は、次のステートメントを使用して各ページで初期化されます。

    <script type="text/javascript" src="/scripts/dojo/dojo/dojo.js" djConfig="parseOnLoad:true,usePlainJson:true,locale:'fr'"></script>
    
  • Adijit.Dialogが最初に作成され、次に次のステートメントによって開かれます (/votingOptions以前と同じ仕様に従う JSP スニペットを返す action-URL --- その JSP スニペット<div>はダイアログの内部に埋め込まれます)。

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

すべてのセットアップの結果として、すべての「通常の」ページ (つまり、dojo ダイアログを脇に置いたもの) は、テキストがデータベースからのものかリソース ファイルからのものかに関係なく、すべての文字、アクセントなどを本来あるべき姿で表示します。

一方、dojo ダイアログの内容は混乱します。アクセントのない文字はすべて問題ありませんが、アクセントの付いた文字は、UTF-8 文字を ISO-8859-1 文字として読み取ろうとした場合とまったく同じように表示されます (これらの文字は、データベースまたはリソース ファイルから取得されます)。

したがって、たとえば、「Kurt Gödel」という名前 (メイン ページに正しく表示されるため) は、Dojo ダイアログでは「 Kurt Gödel 」と表示されます。

Firebug は、両方の状況 (メイン ページを呼び出すか、ページ上で Dojo ダイアログを開くか) で、Tomcat によって提供されるものと同じ応答ヘッダーを報告することに注意してください。

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

これら 2 つのタイプのリクエストの唯一の違い (Content-Length を除く) は次のとおりです。

Transfer-Encoding: chunked

これは、メイン ページをリクエストするときに存在しますが、道場ダイアログの場合には存在しません。

これまでに何が私を逃れたのか、誰かわかりますか?あるいは、この問題の根底にたどり着くためにどのような調査を行うべきかについての提案を歓迎します!

4

2 に答える 2

0

同様の問題がありました。
私の場合、dojo javascript ファイルは iso-8859-1 形式で返されました。それを修正するには、デフォルトの 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;
        }
}
于 2009-08-12T15:36:41.190 に答える
0

Dojo の Dialog ウィジェットは URL /votingOptions を呼び出します。これは、サーブレットまたは Struts アクションによって処理されると想定しています。

これは Ajax 呼び出しであるため、struts アクションを使用している場合はHttpServletResponse、ビューにリダイレクトするのではなく、オブジェクトを介して応答を送信していると思います。

いずれにせよ、必ず次のものを使用してください。

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

それ以外の:

response.getOutputStream().println(str);

これらのコードで、発生していた動作を再現できました。最初のものはすべての文字を正しく表示し (日本語のものも!)、2 つ目は文字化けしたメッセージを表示します。

Ajax アプリを開発しているので、 HttpFoxプラグインも必ずインストールしてください。これは、Firebug よりも HTTP トラフィックを表示するのに適しています。

于 2009-02-16T20:15:14.207 に答える