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 に問い合わせるけど、表示は日本語のままにしてくれる。
変換のしかた
このサイトで
コマンドライン (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.com と gооgle.com は見た目は同じだけど、後者の о はキリル文字。
これを IDN homograph attack といい、フィッシング詐欺で使われる。
ブラウザの Chromium 系は、ASCII と非 ASCII が混在するドメインは Punycode 表示に切り替えて警戒を促す。