PHPで日本語ドメインを扱う方法(Punycode変換)

先日、日本語ドメインを扱うお仕事があったんですが、その際 Punycode(ピュニコード)でURLが渡された場合に日本語ドメインに変換して表示したいという要件がありました。

具体的にはこんな風に相互に変換する処理です。ちなみに、このドメインは取得してませんのであしからず(笑)

デザインビッツ.com ⇔ xn--eck9a0bel8e7k.com

これまで僕は日本語ドメインを使ったことがなくて、そのうちまた扱う時にスッカリ忘れてしまってそうなので、メモということで。対象言語はPHPです。

実際に以下のサイトでPunycode変換を確認することができます。

日本語JPドメイン名のPunycode変換・逆変換 - 日本語.jp

ようするにここのフォームと同じことができればよいわけですが、どうすればいいのかなあとググっていたら、PEARのNet_IDNAというライブラリを使えば一発で解決できそうだ、ということがわかりました。

IDNAとは "Internationalizing Domain Names in Applications(アプリケーションにおけるドメイン名の国際化)"のことで、RFC3490にて規定されてます。

ちなみに、PEARのライブラリにはNet_IDNAとNet_IDNA2があり、Net_IDNAはすでに開発終了してるそうなので、Net_IDNA2を使うことにしました。pearコマンドまたは、PEARのパッケージマネージャを使ってインストールします。

pear install Net_IDNA2

使い方は非常に簡単です。Net_IDNA2のインスタンスを作ってから encodeでエンコード(符号化)、decodeでデコード(復号化)するだけです。

require_once 'Net/IDNA2.php';
$idna = Net_IDNA2::getInstance();

$enc_str = $idna->encode('デザインビッツ.com'); // 符号化
$dec_str = $idna->decode('xn--eck9a0bel8e7k.com'); // 復号化

echo 'デザインビッツ.com => ' .  $enc_str . "\n";
echo 'xn--eck9a0bel8e7k.com => ' .  $dec_str . "\n";

以下、実行結果です。相互に変換できることを確認しました。

デザインビッツ.com => xn--eck9a0bel8e7k.com
xn--eck9a0bel8e7k.com => デザインビッツ.com