Punycode とは

日本語・中国語・絵文字のような ASCII 以外の文字を含むドメイン (IDN: Internationalized Domain Name) を、xn-- で始まる ASCII 文字列に変換する仕組み (RFC 3492)。

例:

  • 年齢早見表.jp → xn--hwtx9n7m5ai7ax48d.jp
  • 日本.jp → xn--wgv71a.jp

DNS は 1980 年代の設計で ASCII しか想定していなかったから、新しく非 ASCII を扱うために「変換」というアプローチが採用された。

ブラウザでは日本語のまま見える

年齢早見表.jp をアドレスバーに入れると、ブラウザは内部的に Punycode (xn--hwtx9n7m5ai7ax48d.jp) に変換して DNS に問い合わせるけど、表示は日本語のままにしてくれる。

変換のしかた

このサイトで

Punycode 変換ツール

コマンドライン (PHP)

echo idn_to_ascii('年齢早見表.jp', IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46);
// => xn--hwtx9n7m5ai7ax48d.jp

echo idn_to_utf8('xn--hwtx9n7m5ai7ax48d.jp', IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46);
// => 年齢早見表.jp

Python

domain = '年齢早見表.jp'
print(domain.encode('idna').decode())
# => xn--hwtx9n7m5ai7ax48d.jp

セキュリティ: 同形異義文字攻撃

google.comgооgle.com は見た目は同じだけど、後者の о はキリル文字。 これを IDN homograph attack といい、フィッシング詐欺で使われる。

ブラウザの Chromium 系は、ASCII と非 ASCII が混在するドメインは Punycode 表示に切り替えて警戒を促す。

関連リンク