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 が表示されるでしょう