Punycode とは
この記事は約 4 分で読めます。
URL バーに「日本.jp」と入力したのに「xn--wgv71a.jp」と表示される。この変換を担っているのが Punycode です。ドメイン名は伝統的に ASCII の英数字とハイフンしか使えませんでした。日本語や絵文字を含む国際化ドメイン名 (IDN) を扱うために、 非 ASCII 文字を ASCII に符号化する仕組みとして Punycode が標準化されました。普段は意識しませんが、 ブラウザのアドレスバーやセキュリティの裏側で重要な役割を果たしています。
定義
Punycode は、Unicode 文字列を ASCII の限定文字セット (a-z, 0-9, ハイフン) のみに符号化する変換アルゴリズムです。 RFC 3492 で標準化され、国際化ドメイン名 (IDN, Internationalized Domain Names) の中核技術として、 非 ASCII 文字を含むドメインを既存の DNS インフラで扱えるようにしています。変換結果には「xn--」というプレフィックスが付きます。
なぜ必要なのか
DNS (Domain Name System) は 1980 年代に設計されたとき、ドメイン名は ASCII の英数字とハイフンに限定されました。 2000 年代に入って世界中の言語に対応する必要性が高まりましたが、既存の DNS インフラを書き換えるのは現実的ではありませんでした。 そこで「ASCII 互換符号化 (ACE, ASCII Compatible Encoding)」として Punycode が考案され、 DNS には ASCII 文字列を渡しつつ、ユーザーには元の言語の文字を見せる仕組みが実現しました。
変換例
| 元のドメイン | Punycode 表現 |
|---|---|
| 日本.jp | xn--wgv71a.jp |
| München.de | xn--mnchen-3ya.de |
| правда.рф | xn--80aafi6cg.xn--p1ai |
| 💩.la (絵文字ドメイン) | xn--ls8h.la |
xn-- プレフィックスの意味
変換結果の先頭に必ず付く「xn--」は、「これは Punycode で符号化された文字列です」という識別子です。 DNS リゾルバや TLS 証明書、メールサーバーは、このプレフィックスを見ることで「ASCII 化された IDN」を認識できます。 プレフィックス自体に意味はなく、Unicode に対応していない既存システムとの後方互換性のために選ばれた識別子です。
絵文字ドメインの現実
技術的には絵文字を含むドメイン (.la や .ws の一部 TLD で過去に登録可能だった例) を Punycode 化することは可能です。 しかし、実用面では以下の問題があります。
- Chrome、Firefox、Safari など主要ブラウザは、アドレスバーで絵文字ドメインを Punycode 表示に切り替える設定を持つ
- 多くのメールサーバーが絵文字ドメインを拒否する
- SNS のリンクプレビューや QR コードで読みづらい
- 口頭で人に伝えるのが極めて困難
ブランドのバズ要素として一時話題になることはありますが、ビジネスのメインドメインとして実用に耐える選択肢ではありません。
セキュリティ上の課題
ホモグラフ攻撃
異なる言語の文字で見た目が同じ字 (キリル文字の "а" U+0430 とラテン文字の "a" U+0061) を組み合わせ、 正規ドメインと見分けがつかない攻撃用ドメインを作る手口です。
- 正規:
apple.com - 偽:
аpple.com(最初の "а" がキリル文字)
ブラウザは複数の文字種が混在するドメインや、特定のホモグラフパターンを検出すると、自動で Punycode 表示に切り替えてユーザーに警告します。 Chrome は混合スクリプト検出で「これはホモグラフの可能性がある」と判断したドメインを Punycode で表示します。
フィッシング対策
企業のセキュリティ対策では、自社ブランドに似た IDN ドメインの監視が一般的になっています。 「apple」「google」「microsoft」など主要ブランドに見える Unicode 文字組み合わせを監視するサービスが提供されています。
実務での扱い方
- ドメイン取得: 日本語ドメインは Punycode 化されて DNS に登録される。表示と内部実装の両方を意識する
- メール送信: 送信元・宛先メールアドレスのドメインに非 ASCII を使うと、相手のメールサーバーが拒否する可能性
- SSL 証明書: 多くの認証局が IDN に対応しているが、証明書には Punycode 形式で記載される
- Web リンク: HTML の
hrefに日本語ドメインを書いても、ブラウザが自動で Punycode に変換して通信する
よくある誤解
- ❌ 「Punycode は日本語専用」→ ✅ 全 Unicode 文字に対応
- ❌ 「絵文字ドメインは普通に使える」→ ✅ 主要ブラウザで Punycode 表示になり実用性が低い
- ❌ 「xn-- は無関係なプレフィックス」→ ✅ Punycode 化されたドメインの識別子として必須