Punycode 轉換(國際化域名)

將包含日語等非 ASCII 字元的國際化域名(IDN)與 Punycode(ASCII 相容編碼)相互轉換。

使用提示

  • 由多個標籤(以 `.` 分隔的部分)組成的域名也會按標籤自動判斷並轉換:僅含 ASCII 字元的標籤保持不變,只有包含非 ASCII 字元的標籤才會轉換為帶 `xn--` 字首的形式。
  • 在"Punycode → 域名"模式下,只有包含 `xn--` 字首的標籤會被解碼,其餘標籤將原樣保留。
  • 該轉換邏輯不僅適用於域名,也可應用於郵箱地址中 `@` 之後的部分(域名部分)。
  • 在瀏覽器位址列中實際輸入國際化域名時,大多數瀏覽器會在內部先轉換為 Punycode,然後再進行 DNS 解析。

常見問題

Punycode(RFC 3492)是一種編碼方式,用於將包含日語、中文、阿拉伯語等 Unicode 字元的域名(即國際化域名,IDN)轉換為 DNS 能夠處理的純 ASCII 字串。轉換後的標籤會帶有 `xn--` 字首。

DNS(域名系統)最初的設計只考慮了 ASCII 字元,因此包含日語字元或表情符號的域名無法直接被解析。Punycode 通過將含非 ASCII 字元的域名轉換為 ASCII 字串,使得在完全不改變現有 DNS 基礎設施的前提下實現國際化域名成為可能。

`xn--` 被稱為"ACE 字首"(ASCII Compatible Encoding prefix,ASCII 相容編碼字首),用於向 DNS 及相關軟體表明該標籤是經 Punycode 編碼的國際化域名。瀏覽器等軟體識別到該字首後,通常會將其解碼為原始的 Unicode 字串顯示給使用者。

是的,這是一種被稱為"IDN 同形字攻擊"的釣魚手段。已有報告指出,攻擊者利用外觀幾乎相同但實際不同的字元(例如西里爾字母的"а"與拉丁字母的"a")編碼生成 Punycode 域名(例如 `xn--80ak6aa92e.com`),冒充正規域名。主流瀏覽器的應對措施包括:當檢測到可疑的字元混用時,在位址列中保持顯示 Punycode 形式(以 `xn--` 開頭的字串),而不顯示解碼後的內容。
ツールくん

閒話 ― "貓"與"日本語"如何變成域名的幕後故事

國際化域名(IDN)的討論始於上世紀 90 年代後期,但標準化經歷了很長時間。為了在不改變 DNS 核心結構的前提下處理非 ASCII 字元,業界曾提出多種方案,最終採用了"在應用層(客戶端)完成編碼與解碼,DNS 伺服器本身保持不變"的 Punycode 方案,並於 2003 年正式標準化為 RFC 3492。

"Punycode"這個名字據說源自"Unicode"與"an amusing pun"(有趣的雙關語)的結合,其演算法本身是將更通用的 Bootstring 編碼方法(由 IBM 研究人員設計,用於將任意字元集編碼為受限字元集的通用方法)針對域名場景加以特化而成。就連"Punycode"這個名字的由來本身也帶有幾分玩笑意味,頗能體現開發者社群特有的幽默感。

如今,日語域名(`.jp`)以及表情符號域名(例如確實存在的 `💩.la`)等使用各種語言和符號的域名已被實際註冊和使用,但在這些域名背後,始終都要經過 Punycode 的轉換處理。即便是瀏覽器位址列中顯示的優美的日語域名,在與 DNS 伺服器通訊時,實際傳輸的也是以 `xn--` 開頭的樸素 ASCII 字串。