2011-07-22 9 views
3

私はTapestryアプリケーションを使用して、フォームからデータを取得し、データベースに書き込み、結果を表示します。特殊文字(Ä、Ö、Ü、ß、€...)を使用しない限り、すべて正常に機能します。Tapestry:文字エンコーディングの問題

など。テキスト

TestäöüßÄÖÜ€$ 

は、私は問題が間違った文字エンコーディングの設定とは何かを持っていると思い

TestäöüÃÃÃÃâ¬$ 

になります。

タペストリーJavaクラス:

@Component(parameters = {"clientValidation=false"}) 
private Form form; 

@Component(parameters = {"value=someDTO.name"}) 
private TextField someNameField; 

タペストリーテンプレート:

<t:form t:id="form"> 
    ... 
    <t:textfield t:id="someNameField"/> 
    ... 
</t:form> 

、私はいくつかの場所で私のエンコード設定を確認:

  1. HTMLソース:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
  1. タペストリーの設定が(これはとにかくデフォルトでなければなりません):

    tapestry.charset=UTF-8 
    
  2. Firefoxは言う([ツール]> [ページ情報:エンコーディング):UTF-8。

  3. 基礎となるデータベース(オラクル)もUTF-8を使用:

    character_set_system utf8 
    

をそれから私は、POSTリクエストと二つのヘッダは私の目を引いた検討:

  1. ヘッダーに指定されたコンテンツタイプはありません。

    Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
    
  2. スペースは%20の代わりに+でエンコードされています。

私はまた、次のことを試してみました:

@Component(parameters = {"clientValidation=false", "enctype='application/x-www-form-urlencoded; charset=UTF-8'"}) 
private Form form; 

@Component(parameters = {"clientValidation=false", "enctype='application/x-www-form-urlencoded; charset=UTF-8'", "accept-charset='utf-8'"}) 
private Form form; 

しかし、誰成功の両方(と私は一般的な解決策ではない回避策を探しています)。

興味深いことにthis proposalは、いくつかの特殊文字(ä、ö、ü、ßなど)で動作しますが、ISO-8859-1を使用したくありません。 UTF-8にフォームのエンコーディングを設定するにはどうしたらいいですか?何が欠けているのか、私の問題の理由がまったく違うのですか?

EDIT:データベースなしでテストを行いましたが、問題が残っています。そのため、db側のエンコード設定が間違っているわけではありません。

+0

あなたはどのバージョンのタペストリーを使用していますか? – Mark

+1

これはTapestryの問題ではありません。エンコードは一般的にUTF-8で、うまくいきます。デバッガを使用すると、文字列は最初の時点でどの時点で破損していますか? (私はかつてこれを引き起こしたTomcatインスタンスの設定に問題がありました) – Henning

+1

私はTapestry 5.2.5とJetty 6.1.14を使用していますが、問題はTomcatの展開と同じです。私は、dbなしのサンプルページを作っただけで、テキストフィールドからDTOクラスに値を書き込みます。私はonValidateメソッドにブレークポイントを設定し、その文字列はすでにそこに壊れています。タペストリーの内部構造をより深くデバッグする上で、どこを見なければならないのですか?どの設定がTomcatで誤って設定される可能性がありますか。 – martin

答えて

3

本当に自分のサーバが誤って設定されていました。私のweb.xmlへの次の追加はそれを解決しました(もちろんこれはSpring以外のフィルタでも動作するはずです)。

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

<filter-mapping> 
    <filter-name>charsetFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+0

私にとってこれは役に立ちませんでしたが、私はescape()の代わりにjs関数encodeURIComponent()を使用しました。 – MartinC

0

私はあなたのテスト文字列をTapestry 5.2.6と5.3.0-SNAPSHOTで試してみましたが、うまくいきました。私はそれをHSQLDBデータベースに保存し、期待どおりに取り戻すことができました。

どのバージョンをお使いですか? 5.0.xに戻った場合は、次のようにする必要があります。 http://wiki.apache.org/tapestry/Tapestry5Utf8Encoding

+0

これは初期のベータ版(5.0.8、私が思う)でのみ問題であり、すべての最終リリースが正常に動作します。 – Henning

関連する問題