【Java】URLをエンコード・デコードする方法についてサンプル付きで解説!
  • facebookページ
  • twitterページ
  • 2021.02.25

    【Java】URLをエンコード・デコードする方法についてサンプル付きで解説!

    JavaのURLクラスとは?

    URLクラスは、Uniform Resource Locator (ユニフォーム・リソース・ロケータ)、World Wide Web上のリソースへのポインタを表すものです。

    リソースは、ファイル・ディレクトリのような単純なものである場合や、データベース・検索エンジンに対するクエリーなど、複雑なオブジェクトへの参照の場合もあります。

    アクセスしたい情報のURLがわかっていれば、java.net.URLクラスを用いることで、簡単に取得可能です。

    URLクラスで使用できるメソッドは次の通りです。

    修飾子と型 メソッドと説明
    boolean equals(Object obj)
    URLと別のオブジェクトとが等しいかどうかを比較
    String getAuthority()
    URLの機関部分を取得
    Object getContent()
    URLのコンテンツを取得
    Object getContent(Class[] classes)
    URLのコンテンツを取得
    int getDefaultPort()
    URLに関連するプロトコルのデフォルトのポート番号を取得
    String getFile()
    URLのファイル名を取得
    String getHost()
    該当する場合、URLのホスト名を取得
    String getPath()
    URLのパス部分を取得
    int getPort()
    URLのポート番号を取得
    String getProtocol()
    URLのプロトコル名を取得
    String getQuery()
    URLのクエリー部分を取得
    String getRef()
    URLのアンカー(参照)を取得
    String getUserInfo()
    URLのユーザー情報部分を取得
    int hashCode()
    ハッシュ表のインデックス付けに適したint値を作成
    URLConnection openConnection()
    URLが参照するリモート・オブジェクトへの接続を表すURLConnectionインスタンスを返却
    URLConnection openConnection(Proxy proxy)
    openConnection()とほぼ同様だが、接続の確立が指定されたプロキシ経由で行われる点が異なる
    プロキシ処理をサポートしないプロトコル・ハンドラは、プロキシのパラメータを無視し、通常の接続を確立
    InputStream openStream()
    URLへの接続を開き、その接続から読み込むためのInputStreamを返却
    boolean sameFile(URL other)
    フラグメント・コンポーネント以外の2つのURLを比較
    static void setURLStreamHandlerFactory
    (URLStreamHandlerFactory fac)
    アプリケーションのURLStreamHandlerFactoryを設定
    String toExternalForm()
    URLの文字列表現を構築
    String toString()
    URLの文字列表現を構築
    URI toURI()
    このURLと等価なURIを返却

    URLのエンコード・デコードとは?

    JavaでURLのエンコード・デコードをする場合は、「URLEncoderクラス」「URLDecoderクラス」を使用しましょう。

    • URLEncoderクラス:HTML形式をエンコードするためのユーティリティ・クラス
    • URLDecoderクラス:HTML形式をデコードするためのユーティリティ・クラス

    エンコード・デコードする際は、次のルールが適用されます。

    URLのエンコード・デコードする際のルール
    • 英数字文字の「a」から「z」、「A」から「Z」、「0」から「9」は元のまま残る
      特・殊文字の「.」、「-」、「*」、および「_」は元のまま残る
    • プラス記号「+」は空白文字「 」に変換する
    • 「%xy」という形式のシーケンスは、バイトの表現として扱われる
      • 「xy」は8ビットを2桁の16進数で表現したもの
      • バイト・シーケンスを連続して1つ以上含む部分文字列はすべて、エンコーディング結果がそれらの連続したバイトになるような文字へと置換する
      • 文字のエンコード・デコードに使用するエンコーディング方式は指定可能ですが、指定しなかった場合には、プラットフォームのデフォルトのエンコーディングが使用される

    では、実際にサンプルコードで動きを確認しましょう。

    URLをエンコードした結果と、デコードした結果が取得できました。

    適用されるルールの通り、エンコード時は指定した文字以外・日本語部分は、16進数表記に変換されています。

    URLエンコード時の半角スペース

    URLをエンコードする場合、半角スペースは「+」に置き換わります。

    置き換わりは不具合ではなく、エンコード時のルールです。

    ポテパンダの一言メモ

    URLDecoder の場合も、同様の仕様に則って「+」でデコードされます。

    実際にサンプルコードで表示を確認すると、次の通りです。

    URLエンコード時のスラッシュ

    実行結果からわかるように、URLをエンコードする場合、スラッシュ(/)は「%2F」の16進数に変換されます。

    URLエンコードでShift_JISは文字化けの可能性あり

    URLEncoder、URLDecoder で Shift_JIS の文字列は上手く処理できない場合があります。

    ポテパンダの一言メモ

    そのため、文字コードは「UTF-8」で指定するのが無難です。

    サンプルで、Shift_JISで指定した場合の処理を記載します。

    今回のサンプルでは、文字化け等の不具合は起きませんでした。

    エンコード・デコード時は第2引数の文字コードを必ず渡す

    URLEncoderクラス、URLDecoderクラスには、第2引数の文字コードを省略可能なメソッドが存在します。

    指定の必要がないので便利に思えますが、こちらのメソッドの使用は非推奨です。

    なぜなら、環境によって文字コードが異なる可能性があるため、予期せぬ不具合が発生することがあるためです。

    さまざまな環境で実行する予定がないとはいえ、どんな不具合が生じるのかわかりません。

    第2引数の文字コードを省略したメソッドの使用は、念のため避けましょう。



    優良フリーランス案件多数掲載中!
    フリーランスエンジニアの案件をお探しなら
    ポテパンフリーランス

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア
    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE