Punycode変換(国際化ドメイン名)

日本語などを含む国際化ドメイン名(IDN)とPunycode(ASCII互換エンコーディング)を相互変換します。

使い方のヒント

  • 複数のラベル(`.`で区切られた部分)からなるドメイン名も、ラベルごとに自動判定して変換します。ASCII文字のみのラベルはそのまま、非ASCII文字を含むラベルだけが `xn--` 接頭辞付きに変換されます。
  • 「Punycode → ドメイン名」モードでは、`xn--` 接頭辞を含むラベルのみをデコード対象とし、それ以外のラベルはそのまま扱います。
  • ドメイン名だけでなく、メールアドレスの `@` より後ろの部分(ドメイン部)にも同じ変換ロジックが適用できます。
  • 実際にブラウザのアドレスバーに国際化ドメイン名を入力すると、多くのブラウザは内部的にPunycodeへ変換した上でDNS解決を行っています。

よくある質問

Punycode(RFC 3492)は、日本語・中国語・アラビア語などUnicode文字を含むドメイン名(国際化ドメイン名、IDN)を、DNSが扱えるASCII文字のみの文字列に変換するためのエンコーディング方式です。変換後のラベルには `xn--` という接頭辞が付きます。

DNS(Domain Name System)は元々ASCII文字のみを前提に設計されたシステムのため、日本語や絵文字を含むドメイン名をそのままでは解決できません。Punycodeによって非ASCII文字を含むドメイン名をASCII文字列に変換することで、既存のDNSインフラをそのまま使いながら国際化ドメイン名を実現しています。

`xn--` は「ACE prefix(ASCII Compatible Encoding prefix)」と呼ばれ、そのラベルがPunycodeでエンコードされた国際化ドメイン名であることをDNSや対応ソフトウェアに伝える目印です。ブラウザ等はこの接頭辞を見つけると、表示時に元のUnicode文字列にデコードして利用者に見せます。

はい、これは「IDNホモグラフ攻撃」と呼ばれるフィッシング手法として知られています。キリル文字の「а」とラテン文字の「a」のように、見た目がほぼ同じ異なる文字を使ってエンコードされたPunycodeドメイン(例: `xn--80ak6aa92e.com`)が、正規のドメインになりすます事例が報告されています。主要なブラウザは、疑わしい文字の組み合わせを検出した場合にアドレスバーでPunycode表記(`xn--`から始まる文字列)のまま表示するなどの対策を行っています。
ツールくん

余談ですが ― 「猫」「日本語」がドメイン名になるまでの舞台裏

国際化ドメイン名(IDN)の議論は1990年代後半から始まりましたが、標準化までには長い時間がかかりました。DNSの根幹を変更せずに非ASCII文字を扱う方法として複数の方式が提案されましたが、最終的に「アプリケーション層(クライアント側)でエンコード・デコードを行い、DNSサーバー自体は変更しない」というPunycode方式(2003年にRFC 3492として標準化)が採用されました。

Punycodeという名前は「Unicode」と「An amusing pun(ちょっとした駄洒落)」に由来するとされ、アルゴリズム自体はBootstring(IBMの研究者らが考案した、任意の文字集合を制限された文字集合にエンコードする汎用手法)という、より一般的なエンコーディング手法をドメイン名向けに特化させたものです。Punycodeという名前の由来自体がジョーク混じりであるところに、開発者コミュニティらしいユーモアが感じられます。

現在、日本語ドメイン(`.jp`)や絵文字ドメイン(`💩.la`のような実例も存在する)など、様々な言語・記号を使ったドメイン名が実際に登録・運用されていますが、その裏側では必ずこのPunycodeによる変換処理が行われています。ブラウザのアドレスバーに表示される美しい日本語ドメインも、DNSサーバーとの通信では地道な`xn--`から始まるASCII文字列としてやり取りされているのです。