2011-12-22 5 views
4

Webアプリケーション(JSF 1.2、Spring、Tomcat 7)で文字セットのエンコーディングに問題があります。テストするためのアイデアが不足していますうまくいかない。POSTパラメータがJSF 1.2で間違ったエンコーディングを使用しています

私は「CA」のようなものを提出するたびに、私は「çã」取得:それは、UTF-8は、JSFのライフサイクルでのISO-8859-1どこかに変換されるときにPOSTさ私のデータを意味します。

System.out.println(new String("çã".getBytes("UTF-8"), "ISO-8859-1")); 

ことができます(私は間違って変換はJSFのライフサイクルのどこかにあると信じている:それは同じ出力がためだ原因

は私がISO-8859-1に誤った変換がUTF-8であることを知っています

public void debugValidator(FacesContext context, UIComponent component, 
     Object object) throws ValidationException { 
    System.out.println("debug validator:"); 
    System.out.println(object); 
    System.out.println("\n"); 
    throw new ValidationException("DEBUG: " + object.toString()); 
} 

し、そのメッセージのように返します: "DEBUG:çã"

  • ?私はMBでバリデータを設定する原因の前に)なります私はすべての.xhtmlページに最初の行を<?xml version="1.0" encoding="UTF-8"?>としています。私はBalusC's articleに応じて、デフォルト
  • でUTF-8を使用するには、要求の文字エンコーディングを設定するので、それは必要はありませんが、私はとにかく設定し、SpringのCharacterEncodingFilterweb.xmlのでのFaceletsを使用してい
  • UTF-8。
  • 私はそれは私のブラウザのせいではありませんだけで
  • を保証するために、Tomcatのserver.xmlファイルにURIEncoding="UTF-8"を入れて、それがコンソールで同じことを印刷し、私の環境では、すべてのUTF-8です。

さらに何をテストできますか?私の間違った仮定は何でしょうか?

ありがとうございます!

答えて

7

BalusCの答えは、問題をよりよく理解するために私を助けたが、何私のためにそれを解決することはのweb.xmlファイル内の他のすべての上にそれを置く(チェーンにとしてFIRSTフィルタを文字エンコーディングフィルターを入れていました)。パラメータは、フィルタによって設定された前

<!-- filter enforcing charset UTF-8 - must be first filter in the chain! --> 
<filter> 
    <filter-name>characterEncodingFilter</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> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>characterEncodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

どうやら、データが読み込まれました:

これは私が使用したフィルタです。 私はこのページからヒントを得ました:http://tech.top21.de/techblog/20100421-solving-problems-with-request-parameter-encoding.html

ありがとうございました!

3

この現象は、ブラウザがUTF-8ではなくISO-8859-1エンコーディングを使用してデータを送信したことを示しています。これは、HTTP応答Content-Typeヘッダーが適切なcharset属性で設定されていないことを意味します。例えば次のようにFirebugのために、あなたはそれを見つけることができます。

enter image description here

をあなたがたFaceletsがデフォルトでUTF-8を使用していることですね。しかし、Faceletsの初期のバージョンは、デフォルトでUTF-8を使用するようにはプログラムされていませんでした。他にもissue 46およびissue 53も参照してください。 Faceletsは現在1.1.15.B1です。

XMLプロローグの存在は厳密には必要ではなく、そのエンコーディングは決してレスポンスエンコーディングを設定するために使用されるものではなく、XMLパーサーが入力ストリームをデコードするためにのみ使用します文字。 Springのフィルタも必要ではありませんが、追加した後で問題を解決できなかったということは、データをISO-8859-1として送信したクライアントであるという十分な証拠です。

+0

こんにちは、BalusC、あなたの答えに感謝を参照してください私はそれが他の方法で回避だと思う、Content-TypeヘッダをUTF-8に設定されている原因となります。さて、ブラウザのエンコーディングを手動でISO-8859-1に変更したかどうか確認したところ、文字はバリデーターメッセージに正しく表示されます。今、それはどういう意味ですか? – elias

+0

Faceletsについて、私は1.1.15.B1 btwを使用しています。 – elias

+0

_Content-type_が_text/html; charset = UTF-8_に設定されているにもかかわらず、ブラウザがISO-8859-1としてデータを送信している可能性がありますか? – elias

1

フォームにenctype="multipart/form-data"があるかどうかを確認してください。

this questionフォームより多くの情報

関連する問題