Java

Javaで実装するURLエンコード

URIにおいて使用できない文字を使う際に行われるエンコードのことを、一般的に「URLエンコード」と呼びます。JavaでURLエンコード/デコードを実装する方法を解説します。

具体例

対象の文字列を符号化した上でパーセントエンコードするため、具体的には次のように変換されます。

UTF-8による変換の例

変換対象の文字列デベルマン
符号化デ .. e38387
ベ .. e38399
ル .. e383ab
マ .. e3839e
ン .. e383b3
パーセントエンコーディング%e3%83%87%e3%83%99%e3%83%ab%e3%83%9e%e3%83%b3

URLとして使用する例

https://www.google.com/search?q=%E3%83%87%E3%83%99%E3%83%AB%E3%83%9E%E3%83%B3

実装方法

Javaの標準クラスライブラリのみで実現ができます。追加のライブラリは不要です。

エンコード

 java.net.URLEncoder.encode()にエンコード対象の文字列と文字コードを渡すと、エンコードされた文字列が返ってきます。

package net.develman.convert;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class UrlEncode {

    public static final void main(String[] args) throws UnsupportedEncodingException {

        //エンコード対象の文字列
        String source = "あいうえお";

        //エンコード実行
        String result = URLEncoder.encode(source, "UTF-8");

        System.out.println("エンコード結果:" + result);
    }
}

実行結果

エンコード結果:%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A

デコード

java.net.URLDecoder.decode()にデコード対象の文字列と文字コードを渡すと、デコードされた文字列が返ってきます。

package net.develman.convert;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

public class UrlDecode {

    public static final void main(String[] args) throws UnsupportedEncodingException {

        //デコード対象の文字列
        String source = "%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A";

        //デコード実行
        String result = URLDecoder.decode(source, "UTF-8");

        System.out.println("デコード結果:" + result);
    }
}

実行結果

デコード結果:あいうえお

余談

古いバージョンのJavaだとShift_JIS文字列のエンコードが正しくできません。バージョン指定のプロジェクト等では、代替手段としてApache Commons Codec の使用を検討してください。

下はMavenの定義例です。プロジェクト管理ツールを使用しない場合はこちらからjarをダウンロードしてプロジェクトに追加してください。

<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.13</version>
</dependency>

ソースコード

    public static final void main(String[] args) throws EncoderException, DecoderException {

        String charset = "UTF-8";
        URLCodec codec = new URLCodec(charset);

        //エンコード対象の文字列
        String source = "あいうえお";
        System.out.println("元の文字列  :" + source);

        //エンコード実行
        String enc = codec.encode(source);
        System.out.println("エンコード結果:" + enc);

        //デコード実行
        String dec = codec.decode(enc);
        System.out.println("デコード結果 :" + dec);
    }

実行結果

元の文字列  :あいうえお
エンコード結果:%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A
デコード結果 :あいうえお
ABOUT ME
sasakiyu
ひ弱で優しい少年だったが、デーモンと合体。 強大な力を得つつも人間の心を失わないデベルマンとなる。