間違った URI エンコーディングで奇妙な問題が発生しました。助けていただければ幸いです。
このプロジェクトでは、JSP、サーブレット、Jquery、Tomcat 6 を使用しています。
JSP の文字セットは UTF-8 に設定され、すべての Tomcat コネクタは URIEncoding=UTF-8 を使用し、こちらで説明されているように文字エンコーディング フィルターも使用します。また、メタ タグに contentType を設定すると、ブラウザはそれを正しく検出します。
Jquery を使用した Ajax 呼び出しでは、URL パラメーターとして使用したい条件で encodeURIComponent() を使用してから、パラメーター セット全体を $.param() でシリアル化します。呼び出されたサーブレットでは、これらのパラメーターは Java.net.URLDecoder.decode(term, "UTF-8") で正しくデコードされます。
一部の場所では、JSP のパラメーター マップから href 要素の URL を生成しています。各パラメーター値は、JSP 側で Java.net.URLEncoder.encode(value, "UTF-8") でエンコードされますが、以前と同じ方法でデコードすると特殊文字が壊れます。代わりに、JSP で「ISO-8859-2」としてエンコードし、サーブレットで「UTF-8」として正しくデコードする必要があります。
明確にするための例: 「überfall」という用語は、Javascript (%C3%BCberfall) を介して URI エンコードされ、デコードおよび処理のためにサーブレットに送信されます。それを JSP に戻した後、UTF-8 としてエンコードし、URL を作成します。たとえば、次のようになります。
<a href="/myWebapp/servletPath?term=%C3%BCberfall">Click here</a>
ただし、このリンクをクリックすると、パラメータが「%C3%83%C2%BCberfall」としてサーブレットに送信され、「überfall」にデコードされます。エンコードが行われない場合も同様です。
エンコーディングに「ISO-8859-2」を使用すると、次のようになります。
<a href="/myWebapp/servletPath?term=%FCberfall">Click here</a>
このリンクをクリックすると、Wireshark で %C3%BCberfall がパラメーターとして送信され、"überfall" に再度デコードされることがわかります。
誰かが私が何かを逃した場所を教えてもらえますか?
編集: Firebug の [ネットワーク] タブを観察しているときに、
$.param({term : encodeURIComponent(term)});
この用語は UTF-8 で 2 回エンコードされ、"%25C3%25BCberfall" になります。つまり、パーセント記号もパーセントでエンコードされます。同様に、パラメータ マップの各値に対して encode(term, "UTF-8") を 2 回呼び出すと、うまくいきます。
String を 1 回エンコードしてデコードしないと、再び "überfall" が発生します。