2009-05-14 18 views
3

私は入力要素をbean setter にマップするJSFによって生成されたHTMLフォームを持っています。それはJSFが途中でユニコード入力を文字化けしているように見えます。特に、セッターでのテスト目的で次の例外を入れますJSFとHTMLフォームのUnicodeの問題?

public void setTitle(String title){ 
    System.out.println("title set with: "+title+"\n"); 
    if (title.startsWith("xxx")) { 
     throw new RuntimeException("debug exception "+title); 
    } 
    this.title = title; 
} 

次にタイトル入力要素のフォームに「xxxx海陆」と入力します。その後、フォームを提出すると、ログ印刷が表示されます。

title set with: xxxx ????? 

(ユニコード互換のMac端末上)。間違って何に

Error setting property 'title' in bean of type 
uk.ac.lancs.e_science.sakaiproject.api.blogger.post.Post: 
java.lang.RuntimeException: debug exception xxxx ���?? 

どれ手がかり: は、私は、レスポンスHTMLページ上のエラーメッセージが表示されますか?私はちょうどそれでいっぱいで、間違った診断をしていますか? 私は他のすべての可能性を排除したと思います。 Unicodeは、同じアプリケーションの他のコンポーネントでうまく動作しているようです。

答えて

3

質問:

  • どのようにフォームが(アプリケーション/ x-www-form-urlencodedでまたはマルチパート/フォームデータ)要求をエンコードしていますか?マルチパートデータはサードパーティのMIMEパーサーを使用してデコードされるため、そこに問題が発生する可能性があります。データがURLエンコードされている場合、正しくエスケープされていますか?
  • ブラウザはどのような文字セットですかaccepting
  • 何かencoding is the server detecting?それはUnicode文字セットですか?
  • lossy encoding(例えば、MacRoman)として書き込んでいるログだけですか?どのサーバを使用しているのですか?default charset

何をコンソールに表示する文字列であるものは限らないので、あなたはこのコードを使用してUnicode code pointsをダンプすることができます

public static void printCodepoints(char[] s) { 
    for (int i = 0; i < s.length; i++) { 
     int codePoint = Character.isHighSurrogate(s[i]) ? Character 
      .toCodePoint(s[i], s[++i]) 
      : s[i]; 
     System.out.println(Integer.toHexString(codePoint)); 
    } 
    } 
+0

マルチパート形式です。たぶん、私はURLエンコーディングに切り替えようとします。どうも。 –

+0

HEY!これは動作するようです!標準のポストエンコーディングに変更するだけです。ありがとう –

+1

私はあまりにもすばらしく祝いません。私は_overcome_文字バグに使用されるmultipart/form-dataを見てきました。フォームファイルのアップロードをしたい場合は必須です。それでも、少なくともあなたは問題がどこにあるのかを知っています。 – McDowell

0

ブラウザは、ワイヤでユニコードを送信できません。何らかの方法でUnicodeをエンコードする必要があります。例外(2つの漢字が5文字になった)の出力から、データがUTF-8としてエンコードされていて、文字列titleがコンポーネントのサーバー側で受信後に正しくデコードされなかったと推測しています。

フォームのaccept-charset属性を設定することをお勧めします。それは誰もが行動するように指示するはずです。私が尋ねることになる

+0

あなたの推測では、あまりにも私の推測です。私はutf-8を使用する必要があります(私の教育用アプリケーションは中国語とサンスクリットを同じ入力要素に含めることができます)。クライアント側のフォームでaccept-charsetをどのように設定すると、サーバー側のコンポーネントがutf-8を正しくデコードするかわかりません。それはどのように機能するのですか?とにかく、構文は何ですか?私はそれを試してみましょう... –

+0

フォームの投稿/ getは実際にはHTMLリクエストです。 accept-charsetを使用すると、サーバが予期している文字セットをブラウザに伝えます。ブラウザはこの情報をリクエストのヘッダーフィールドに入れて、フレームワークに表示させます。そうすれば、関係者全員が何をすべきかを知ることができます。 –