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