request.getparameter中国語文字化けし問題



まず質問です
httpリクエストはISO-8859-1の符号化でurlを転送し、ページのcontent-typeがutf-8であれば、リクエスト送信時に文字をutf-8に変換して転送する.
例えば、漢字「中」のUTF-8は、E 4 B 8 ADが要求時に%E 4%B 8%ADバイト間で%分割されている場合、サーバがこのバイトストリームを受信した後、対応する文字に変換しなければならない.通常使用されているrequest.getParameter(「name」)が文字列を直接取得すると、バイトストリームから文字ストリームへのプロセスシステムが完了する(文字化けの発生はここから始まる)漢字「中」のUTF-8を漢字に変換するプログラムと似ています.
 
public class EncodingTest {

		public static void main(String[] args) {

			String utf_string = "E4%B8%AD";//   UTF-8  ,      , %  
			String[] utf_array = utf_string.split("%");
			byte[] utf_byte = new byte[utf_array.length];
			for (int i = 0; i < utf_array.length; i++) {
				utf_byte[i] = (byte) Integer.parseInt(utf_array[i], 16);
			}
			try {
				System.out.println(new String(utf_byte, "UTF-8"));
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

セグメントコード:new String(utf_byte、「UTF-8」)バイトストリームをUTF-8の符号化で文字列に復元しますが、utf_byteはutf-8のバイトストリームでなければなりません.
 
String aa="中";
bb = aa.getBytes("ISO-8859-1");
new String(bb、「UTF-8」)は文字化けしているに違いない
すなわち,1つの文字列がどのような符号化でバイトストリームに変換されるか,どのような符号化で復元される必要があるかということである.
bb=aa.getBytes(「UTF-8」)はnew String(bb、「UTF-8」)でなければ文字化けません
本題に戻る:
urlはiso-8859-1を介して伝送され、サーバはこのバイトストリームを受信し、デフォルトではISO-8859-1でこのバイトストリームを対応する文字列に復元します.
クライアント:bb=aa.getBytes(「UTF-8」);
サーバに到着:cc=new String(bb,「ISO-8859-1」)はバイトストリームを節子列request.getParameter(""")に復元する.このccを取得すると、ccは当然文字化けしてしまうので、new String(request.getParameter("").getBytes("ISO-8859-1")、"UTF-8")を元の文字列に復元して文字列を元のバイトストリームに復元し、UTF-8を押し直して符号化するというやり方が生まれた.
tomcatでURI-Encodingを変更し、フィルタを使用するには、バイトストリームを文字列に変換する符号化を変更するために使用されると推定します.
問題の原因がわかったら、解決策を話しましょう.私のプロジェクトのコードはUTF-8なので、私のプロジェクトでは文字セットフィルタを使用してすべてのページコードをUTF-8に変更します.私の解決策は、サーバの構成を変更することです.
コンテナがtomcatの場合、プロファイル/conf/server.xmlの変更を設定します.
                   connectionTimeout="20000"
               redirectPort="8443"/>
  
               connectionTimeout="20000"
               redirectPort="8443"URIEncoding="UTF-8"/>
規定容器のuriコードを試してみる
個人的にはこのような解決策はあまりよくないと思います.