URLの問題


URLエンコーダ

ネットワーク上のファイルは URL によって一意に識別することができますが
ネットワーク上のコンピュータは様々で、それを統一することは不可能です
となれば、プラットフォームごとのファイル名の命名規則が問題となります。

システムによって、ファイル名の規則が異なるため
あるシステムではファイル名に使える文字が、他のシステムでは使えないかもしれません

これらの問題を考えると URL で使える文字はアルファベットに限られてしまいます
そこで、URL にはこれらの問題を解決する手段として ASCII コードを採用しています
URL は ASCII の文字、数字、句読点以外の文字を % とそれに続く2桁の16進数で表現します
ただし、空白文字は頻繁に出現するため + 記号で表現されます

Java では、URL のエンコードとデコード処理を行うクラスが用意されています
これを用いることで、プログラマはこの問題を解決することができます
URL のエンコードは java.net.URLEncoder クラスを用います

public class URLEncoder extends Object

このクラスは、2つのエンコード用静的メソッドを公開しています
ただし、最新の Java では古いメソッドが非推奨となっているため
現実的に用いるべきメソッドはたった一つです
URL のエンコーディングには URLEncoder.encode() メソッドを使います
public static String encode(String s , String enc)
			throws UnsupportedEncodingException
s には変換対象の文字列を enc には文字エンコーディング名を指定します
指定された文字エンコーディングがサポートされていない場合は例外が発生します
変換が成功すれば、メソッドは変換した文字列を返します

文字エンコーディング名とは、その名のとおりで
様々ある文字コードのうち、どの文字コードを用いて変換するかという問題です
% の後に続く2桁の16進数による記号表現は、この文字コードに基づいて作成されます

Java プラットフォームは、全実装がサポートする必要のある文字セット
及び標準エンコーディングセットの命名規則を明確に定めています
最低でも Java は次の標準文字セットのサポートを保障しています

文字エンコーディング名解説
US-ASCII 7 ビット ASCII
(ISO646-US/Unicode charsetの Basic Latin ブロック)
ISO-8859-1 ISO Latin Alphabet No. 1 (ISO-LATIN-1)
UTF-8 8 ビット UCS 変換形式
UTF-16BE 16 ビット UCS 変換形式、ビッグエンディアンバイト順
UTF-16BE 16 ビット UCS 変換形式、リトルエンディアンバイト順
UTF-16 16 ビット UCS 変換形式
オプションのバイト順マークで識別されるバイト順

この場では UTF-16 を用いてエンコーディングしてみましょう
import java.net.*;
import java.io.*;

public class Test {
	public static void main(String[] args) {
		try {
			String url = URLEncoder.encode(args[0] , "UTF-16");
			System.out.println(url);
		}
		catch(Exception e) {
			System.err.println(e);
		}
	}
}
このプログラムは、エンコードした結果を標準出力に表示します
元となる URL をコマンドラインから入力すると、次のような結果が得られます

>java Test "http://nekomimi.co.jp/Kitty on your lap.html"
http%FE%FF%00%3A%00%2F%00%2Fnekomimi.co.jp%FE%FF%00%2FKitty+on+your+lap.html

2バイト文字を用いているため、1つの記号は4桁の16進数コードで表されています
この機能を用いれば、ネットワーク上で記号を用いたファイルを指定できます
因みに、この符号化は application/x-www-form-urlencoded MIME 形式と呼ばれます


デコード

上記した方法で URL を符号化することができましたが
変換した文字列を元に戻すことができます
変換した文字列を元に戻すには java.net.URLDecoder クラスを用います

public class URLDecoder extends Object

このクラスも URLEncoder クラスと同様で2つの静的メソッドを持ちますが
一方のメソッドは古く、最新の Java では単一の URLDecoder.decode() のみを使います
public static String decode(String s , String enc)
			throws UnsupportedEncodingException
s には複合化対象の文字列、enc には文字エンコーディング名を指定します
メソッドは複合化した文字列を返します
import java.net.*;
import java.io.*;

public class Test {
	public static void main(String[] args) {
		try {
			String url = URLDecoder.decode(args[0] , "UTF-16");
			System.out.println(url);
		}
		catch(Exception e) {
			System.err.println(e);
		}
	}
}
このプログラムは、コマンドラインから符号化済みの文字列を指定します
例えば上記したエンコード後の文字列を指定すれば、元の URL が表示されるでしょう



前のページへ戻る次のページへ