どのように行います:URLEncode符号化とURLDecode復号


この方法では、自分で符号化形式を指定する必要があります.どちらのクラスも初期化する必要はありません.
  public class URLDecoder extends Object
  public class URLEncoder extends Object
String   text1  =   java.net.URLEncoder.encode(「中国」、「utf-8」);          String   text2   =   java.net.URLDecoder.decode(text1,   "utf-8"); この2つの文が同じページにあると、text 1:%E 4%B 8%AD%E 5%9 B%BD tex 2:中国String China=new String(request.getParameter("China").getBytes("iso8859_1"));     China=java.net.URLDecoder.decode(zhongguo,"utf-8");   
一、URLEncoder
JAvaはstringをこのような形式に符号化するクラスURLEncoderを提供している.Java1.2クラスURLDecoderを追加しました.stringをこの形式で復号できます.この方法は、以前はプラットフォームのデフォルトの符号化形式を使用していたので、異なるシステムでは異なる結果が得られます.しかしjava 1では.4では、この方法は別の方法に取って代わられた.特に注意しなければならないのは,この方法で記号,"","&","=",":"を符号化し,スペース("")を(+)に変換したことである.1つのURLでこれらの文字がどのように使用されるかを規定しようとはしません.これにより、URL全体を一度にこの方法に渡すのではなく、URLをブロック化してコードしなければなりません.クラスURLEncoderの最も一般的な使い方はstringをクエリーすることであり,サーバ側がGET方式を用いたプログラムと対話するために重要である.
たとえば、このstringをコードしたいとします.
  pg=q&kl=XX&stype=stext&q=+"Java+I/O"&search.x=38&search.y=3
このコードは、次のようにエンコードされます.
  String query = java.net.URLEncoder.encode( "pg=q&kl=XX&stype=stext&q=+"Java+I/O"&search.x=38&search.y=3");
       System.out.println(query);
残念なことに、得られた出力は:
  pg%3Dq%26kl%3DXX%26stype%3Dstext%26q%3D%2B%22Java%2BI%2FO%22%26search.x%3D38%26search.y%3D3
これが方法だencode()は盲目的に符号化されている.URLやクエリーstringで使用される特殊な文字(前のstringの「=」、「&」)と、確かに符号化する必要がある文字を区別することはできません.だからURLは一度に1つだけコードする必要があります.
二、URLDecoder
URLEncoderクラスに対応するURLDecoderクラスには2つの静的方法がある.これらは、x−www−form−url−encodedという形式で符号化されたstringを復号する.すなわち、すべてのプラス記号(+)をスペース記号に変換し、すべての%xxを対応する文字に変換します.
public static String decode(String s) throws Exception  
    public static String decode(String s, String encoding) // Java 1.4 throws UnsupportedEncodingException
stringに「%」が含まれているが、それに続く2桁の16進数ではないか、または不正なシーケンスに復号されている場合、この方法はIllegalArgumentException異常を放出する.今度このような状況が発生したら、投げ出されないかもしれません.これは、実行環境に関連しており、不正なシーケンスが検出された場合、IllegalArgumentException異常が放出されない場合、何が起こるかは不明です.Sun's JDK 1.4では、異常は投げ出されず、うまく符号化できないstringに奇妙なバイトを追加します.これは確かに頭が痛くて、安全な抜け穴かもしれません.
この方法は非エスケープ文字に触れていないので、URL全体をパラメータとしてこの方法<以下のqerry>に渡すことができます.以前のようにブロックして行わなくても、正しい復号結果が得られます.例:
String input = "http://www.altavista.com/cgi-bin/"+"qerry?pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3";  
try {  
    String output = java.net.URLDecoder.decode(input, "UTF-8");  
    System.out.println(output); 
 }