jspのリクエストパラメータにおける中国語の読み取り問題


HTTPプロトコルは,ブラウザがウェブサーバに伝達するパラメータ情報に特定の特殊文字が現れないように規定しており,これらの文字をURL符号化してから伝達しなければならない.URLの特殊文字の一部については、ブラウザが自動的にエンコードします.これらの文字には「/?&」などのほか、漢字などのunicode文字も含まれています.この場合の符号化は比較的特殊である.IEには「常にUTF-8を使用してURLを送信する」という選択肢があり、このオプションが有効である場合、IEは特殊文字に対してUTF-8符号化を行い、同時にURL符号化を行う.変更オプションが無効な場合は、デフォルトの符号化「GBK」が使用され、URL符号化は行われません.ただし、URLの後ろのパラメータについては、常に符号化されず、UTF-8に相当するオプションは無効です.例えば「中国語.html?a=中国語」は、UTF-8オプションが有効である場合、「%e 4%b 8%ad%e 6%96%87.html?a=x 4 ex 2 dx 65 x 87」というリンクを送信します.UTF-8オプションが無効な場合、リンク「x 4 ex 2 dx 65 x 87.html?a=x 4 ex 2 dx 65 x 87」が送信されます.後者の前の「中国語」の2文字は4バイトしかないのに、前者は18バイトであることに注意してください.これは主にURL符号化の原因です.web server(tomcat)がリンクを受信すると、URL復号、すなわち"%"が削除され、ISO 8859-1符号化(上記で説明したように、URLEncodingを使用して他の符号化に設定することができる)に従って識別される.上記の例の結果は、それぞれ「ue 4 ub 8 uadue 6 u 96 u 87.html?a=u 4 eu 2 du 65 u 87」と「u 4 eu 2 du 65 u 87.html?a=u 4 eu 2 du 65 u 87」であり、前者の前の「中国語」の2文字が6文字に復元されていることに注意する.ここでは「u」でunicodeを表します.したがって,クライアント設定によって同じリンクがサーバ上で異なる結果を得た.2つのケースの解決策:1.HTTPリクエストメッセージのリクエスト行におけるURLアドレス後のパラメータ(getメソッド提出フォーム)については、getParameterなどのメソッドによるURL復号に用いられる文字セット符号化は、サーブレット仕様では明確に規定されておらず、各サーブレットエンジンメーカーが独自に決定する.この場合、TomcatのサーブレットRequestオブジェクトのgetParameterなどのメソッドは、デフォルトでISO 8859-1で復号されます.サーブレットRequestインタフェースには、要求メッセージのエンティティコンテンツの文字セット符号化名、requestを設定するsetCharacterEncodingメソッドが定義されている.getParameterメソッドは、このメソッドで設定された文字セット符号化によってエンティティコンテンツをURL復号する.setCharacterEncodingメソッドで設定文字セットは、getParameterメソッドを使用してPOSTからのコンテンツのURL復号の結果にのみ影響し、URLアドレス後のパラメータのURL復号の結果には影響しないため、setCharacterEncodingメソッドを使用して要求メッセージの実体コンテンツの文字セット符号化名を設定しても解決策:a)Tomcat構成では、コネクタ(HTTP Connector)属性には、URL後の追加パラメータをURL復号する際に文字セット符号化をどのように選択するかを設定するURIEncodingとuseBodyEncodingForURI属性があります.URIEncodingは、URL作成後の追加パラメータの文字セット符号化に用いる、useBodyEncodingForURIは、URIEncodingの設定に代えて、実体コンテンツの文字セット符号化設定を採用するか否か、すなわち、useBodyEncodingForURI属性がtrueに設定されている場合、サーブレットRequestを説明する.setCharacterEncodingメソッドで設定された文字セット符号化も、getParameterなどのメソッドがURLアドレス後のパラメータをURL復号した結果に影響します.(/%TomCat_Home%/confserver.xmlファイルにタグを付けて、後にuseBodyEncodingForURI=true)bを付ける)前述したように、IEオプション「常にUTF-8を使用してURLを送信する」が選択されていてもURLの後のパラメータは符号化されないので、URLの後の中国語パラメータは手動でURL符号化するのが望ましい.Javaを使用できます.net.URLEncoder.encode()メソッドを符号化し、ブラウザに表示されるのはパーセンテージなどの文字の山です.例を参照してください.
MyJsp.jsp

<body>
   <%
   String name = " , ";
   //name = java.net.URLEncoder.encode(name,"utf-8");
    %>
    <a href="<%=request.getContextPath()%>/jsp/compactInfo/jsp1.jsp?name=<%=name%>"> </a>
  </body>

jsp1.jsp

<body>
   <%
     String name = request.getParameter("name");
     name = java.net.URLDecoder.decode(name,"utf-8");
    // name = new String(name.getBytes("iso8859-1"),"utf-8");
    %>
     :<%=name %>
  </body>

2.post方式の「アプリケーション/x-www-form-urlencoded」符号化形式のエンティティコンテンツについて、getParameterなどの方法でサーブレットRequestオブジェクトのgetCharacterEncoding()メソッドで返される文字セットをURL復号する.getCharacterEncoding()メソッドがnullを返す場合、ISO 8859-1