注目の書籍

好評発売中!

IT提案戦術

IT営業、SE必読の提案 術マニュアル。顧客ア プローチから契約まで 提案力向上の秘訣満載

ソフト開発

Java技術最前線

ITpro

「Java SE 6完全攻略」
第38回 国際化ドメイン名を使用する

2007/07/30

ドメイン名に漢字などを使用できる国際化ドメイン名を使用したことがありますか?

Firefox、Operaなど主要なブラウザは国際ドメインに対応していますし、Internet ExplorerもIE 7で国際化ドメインに正式に対応したので、今後使われることも多くなっていくのではないでしょうか。

しかし、国際ドメイン名に対応していないブラウザではどうしましょう。

国際化ドメイン名はそのままではDNSで利用できないため、DNSが扱える形式に変換する必要があります。この変換はRFC 3490で定義されています。

つまり、UnicodeからASCIIにRFC 3490に則って変換してあげれば、国際ドメイン名に対応していないブラウザでもhttp://日本語.jpなどを閲覧することができるのです。

問題はその変換をどうやって行なうかということです。

そんなときこそ、Java SE 6です。

Java SE 6では国際ドメイン名を変換するためのクラスjava.net.IDNが導入されました。ちなみにIDNはInternationalized Domain Nameの略です。

このIDNクラスを使用すれば、ASCII以外の文字を使用しているドメイン名をASCIIを使用したドメイン名に変換することができます。もちろん、その逆も可能です。

実際にサンプルを使って確かめてみましょう。

サンプルのソース IDNTranslator.java

IDNクラスは2つのstaticなメソッドが定義されています。ASCIIに変換するのがtoASCIIメソッド、Unicodeに変換するのがtoUnicodeメソッドです。

    public IDNTranslator(String domainname, boolean toUnicode) {
        if (toUnicode) {
            // ASCII への変換
            String ace = IDN.toASCII(domainname);
            System.out.println(ace);
        } else {
            // Unicode への変換
            String idn = IDN.toUnicode(domainname);
            System.out.println(idn);
        }
    }

特に難しいところはないですね。単にメソッドをコールしているだけです。

それでは実行してみましょう。

C:\>java IDNTranslator -a 日本語.jp
xn--wgv71a119e.jp

C:\>java IDNTranslator -a 渋谷.jp
xn--i5wq75d.jp

C:\>java IDNTranslator -u xn--i5wq75d.jp
渋谷.jp

C:\>java IDNTranslator -u xn--wgv71a119e.jp
日本語.jp
 
C:\>

ここで示したように、国際ドメイン名をASCIIに変換すると、xn--で始まる名称になります。このxn--で始まるドメイン名をカット&ペーストでIE 6のアドレスバーに入力すると、国際ドメイン名が表しているドメインを閲覧できるはずです。

URL/URIとして扱う場合の注意点

IDNクラスで変換するのはあくまでもドメイン名の部分だけです。これはURLもしくはURIで扱う場合も同じです。したがって、http:とかftp:といったプロトコルも含めて変換しないようにしましょう。

たとえば、先ほどのIDNTranslatorクラスでhttp://日本語.jp/を変換してみましょう。

C:\>java IDNTranslator -a http://日本語.jp/
xn--http://-is3o55gu19k.jp/
 
C:\>

http://の前にxn--がついてしまいました。これではURLとして役に立ちません。

URLやURIとして扱うのであれば、URL#getHostメソッドもしくはURI#getAuthorityメソッドでドメイン名の部分を取り出してから変換します。

サンプルのソース SimpleBrowser.java

このサンプルはjava.awt.Desktopクラスを使用してブラウザを起動させます。国際ドメイン名を使用している場合は、ASCIIに変換してからブラウザを起動します。

    private URI toURI(String uriText) throws URISyntaxException {
        URI uri = new URI(uriText);
		
        // ドメイン名を取り出して、ASCII に変換
        String host = uri.getAuthority();
        host = IDN.toASCII(host);
        
        return new URI(uri.getScheme(), host,
                       uri.getPath(), uri.getFragment());
    }

http://日本語.jp/を指定して起動してみました。

C:\>java SimpleBrowser http://日本語.jp/

すると、図1に示したようにブラウザで正しく表示をすることができました。

SimpleBrowserの実行結果
図1 SimpleBrowserの実行結果

国際化ドメイン名なんか使わないと思われているかもしれませんが、ブラウザの対応などはずいぶん進んでいます。

Java SE 6でも国際化ドメイン名に対応していることだけでも覚えておけば、いざというときにすぐ使えますよ。

著者紹介 櫻庭祐一

横河電機 ネットワーク開発センタ所属。Java in the Box 主筆

今月の櫻庭

5月の今月の櫻庭でツバメのことを書きました。その後,4羽のヒナが生まれ,成長し,巣立ちしてしまいました。もちろん自分が飼っていたわけではありませんが,巣立ちしてしまった後は一抹の寂しさを感じていました。

ところが,その巣のそばにもう1つツバメの巣があることを最近発見しました。こちらの巣はまだ卵を温めているところです。通勤途中にツバメの様子をうかがうのが,毎日の日課になっています。

生まれてすぐの頃 羽が抜け替わりだす もうすぐ巣立ち
生まれてすぐの頃 羽が抜け替わりだす もうすぐ巣立ち

 


■変更履歴
図の中で「C:\>java IDNTranslator -a 日本語.jp」としていましたが,正しくは「C:\>java IDNTranslator -a http://日本語.jp/」です。お詫びして訂正します。本文は修正済みです。 [2007/07/30 18:15]

この記事に対するfacebookコメント

nikkeibpITpro

読みましたか? 〜 未読記事をご紹介