9

私の同僚は、アクセントのある文字(è、é、àなど)をマングリングする基本的なcontact-usタイプのフォームを作成しました。Struts1でJavaeコマースプラットフォームのKonaKartを使用しています。

問題をHttpServletRequestオブジェクトを介して受信するデータに絞り込みました。同様の(適切に機能している)フォームを比較すると、古いフォームではリクエストオブジェクトの文字エンコード(request.getCharacterEncoding())が「UTF-8」として返されますが、新しいフォームではNULLとして返され、テキストはrequest.getParameter()すでに壊れています。

それを除けば、既知の良い形式と新しく壊れた形式の間に大きな違いは見つかりませんでした。

私が除外したこと:

  • 両方のHTMLページに次のタグがあります。<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  • HTMLの両方のフォームタグはPOSTを使用し、エンコーディングを設定しません
  • Firebugから確認すると、RequestヘッダーとResponseヘッダーの両方に同じプロパティがあります
  • 両方のJSPページは、<%@page contentType="text/html;charset=UTF-8" language="java" %>タグで同じ属性を使用します
  • * Form.javaファイルでは、リモートで興味深いことは何も起こっていません。どちらもBaseValidatorFormから継承しています。
  • ソースファイルのエンコーディングを確認しましたが、すべてデフォルトに設定されています-コンテナから継承:UTF-8

それらをISO-8859-1からUTF-8に変換すると、うまく機能しますが、コアの問題を理解したいと思います。例えば:new String(request.getParameter("firstName").getBytes("ISO-8859-1"),"UTF8")

どんな提案でも大歓迎です、私はすべてアイデアがありません。

4

2 に答える 2

15

Content-Type最近のブラウザは通常、HTTPリクエストヘッダーで文字エンコードを提供しません。Content-TypeHTMLフォームベースのアプリケーションの場合ですが、フォームでページを提供する最初のHTTP応答のヘッダーで指定されているのと同じ文字エンコードです。リクエスト文字エンコーディングを自分で同じエンコーディングに明示的に設定する必要があります。これは、あなたの場合はUTF-8です。

request.setCharacterEncoding("UTF-8");

リクエストからリクエストパラメータを取得する前にこれを実行します(そうでない場合は手遅れです。サーバープラットフォームのデフォルトのエンコーディングを使用してパラメータを解析します。これは実際にはISO-8859-1であることがよくあります)。マップされているサーブレットフィルター/*は、これに最適な場所です。

参照:

于 2012-09-10T19:25:13.157 に答える
0

はリクエスト属性にrequest.getCharacterEncoding()依存しますが、Content-TypeAccept-Charset

したがってapplication/x-www-form-urlencoded;charset=IS08859_1、POSTアクションで機能するはずです。タグは<%@pagePOSTデータには影響しません。

于 2012-09-10T19:26:31.937 に答える