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を変更したり、フィルタを使用したりするには、バイトストリームを文字列に変換する符号化を変更します.