把 Punycode 轉成 ASCII(或轉回 Unicode),對於在只接受 ASCII 字元的系統中處理國際化網域名稱(IDN)來說是不可或缺的。Punycode 定義於RFC 3492,它會把 Unicode 字元編碼成一個有限的 ASCII 子集,讓像「bücher.example」這樣的網域,能在網域名稱系統(DNS)中,以「xn--bcher-kva.example」的形式表示。這種轉換,確保了與 DNS 基礎架構的相容性,同時對使用者保留原本的 Unicode 拼寫。這個過程包括:把網域拆成幾個標籤(label)、分別對每個標籤做編碼或解碼,並為非 ASCII 標籤加上或移除「xn--」前綴。舉例來說,網域「例子.測試」編碼後會變成「xn--fsqu00a.xn--0zwm56d」,而這個工具則會反向執行這個轉換,還原出原本的 Unicode 字元。這對於需要在只接受 ASCII 輸入的環境中處理 IDN 的網域註冊商、憑證授權單位,以及網頁開發者來說,特別有用。

雖然 Punycode 讓全球化的網域名稱得以實現,但它並不保證安全性或可用性。解碼一個「xn--」網域,會顯露出它的 Unicode 表示形式,但來自不同文字系統、外觀相似的字元(例如西里爾字母的「а」對比拉丁字母的「a」),仍然可能帶來風險。請務必獨立驗證一個網域所屬的組織與書寫系統。Punycode 轉換工具(Punycode Converter)簡化了這個過程,直接在你的瀏覽器本機完成轉換,不會把資料上傳到外部伺服器。它嚴格遵循 RFC 3492,使用固定的常數,例如基數 36、最小 tmin 值 1,以及最大 tmax 值 26,確保結果一致。不過,它不會套用某些瀏覽器或註冊機構可能使用的額外 Unicode 正規化,或情境相關的 IDN 規則。這代表這個工具提供的是原始的 Punycode 轉換結果,依目標系統的不同,可能還需要進一步驗證。

convert punycode to ascii
convert punycode to ascii

什麼時候該用 Punycode 轉換

在幾種網域名稱必須與只接受 ASCII 的系統互動的情境中,Punycode 轉換是必要的。最常見的使用情境,是向網域註冊商或 DNS 服務商註冊或管理國際化網域名稱(IDN)。許多註冊機構,要求 IDN 必須以 Punycode 編碼過、帶有「xn--」前綴的 ASCII 形式提交。舉例來說,如果你擁有網域「mañana.com」,你就需要把它轉換成「xn--maana-pta.com」,才能設定 DNS 紀錄,或取得 SSL 憑證。同樣地,使用不支援 Unicode 的 API 或資料庫的網頁開發者,必須在儲存或傳輸 IDN 之前,先把它編碼。另一個關鍵的使用情境,是檢查可疑的網域:解碼一個「xn--」網域,會顯露出它的 Unicode 表示形式,幫助你辨識出潛在的同形異義字攻擊,或搶註相似網域的嘗試。Punycode 也用在電子郵件系統中,因為信箱位址中「@」之前的本地部分,可能含有非 ASCII 字元,而這些字元必須經過編碼,才能符合 SMTP 的相容性要求。

不過,Punycode 並不是能滿足所有文字編碼需求的通用方案。它是專為網域標籤設計的,不會處理帶有路徑、查詢參數,或片段的完整網址。舉例來說,要轉換「https://bücher.example/shop」,只需要編碼網域的部分(「bücher.example」→「xn--bcher-kva.example」),網址其餘的部分則維持不變。Punycode 轉換工具會透過拒絕含有協定、斜線,或其他網址元件的輸入,來強制執行這個範圍限制。此外,Punycode 並不會在語言或文字系統之間做翻譯——它單純只是把 Unicode 碼位編碼成 ASCII。像「xn--80ak6aa92e.com」這樣解碼後的網域,會變成「apple.com」(使用西里爾字母的「a」),外觀上與拉丁字母版本一模一樣,但其實是不同的網域。請務必把解碼出來的 Unicode,拿去對照預期的組織與文字系統做交叉核對,以避免釣魚風險。

如何把 Punycode 轉成 ASCII 或 Unicode

  1. 打開 Punycode 轉換工具,方法是在瀏覽器中造訪/encoding/punycode-converter/。這個工具完全在本機執行,因此不會上傳任何資料。
  2. 貼上你的網域名稱到輸入欄位中。這個工具只接受網域名稱(例如「bücher.example」或「xn--bcher-kva.example」),不接受完整網址或其他文字。貼上之前,請先移除任何協定(http://)、路徑(/shop),或查詢參數(?id=123)。
  3. 選擇轉換方向
    • 選擇Unicode 轉 ASCII,如果你的輸入是一個 Unicode 網域(例如「bücher.example」),而你需要 Punycode 編碼後的 ASCII 版本(例如「xn--bcher-kva.example」)。
    • 選擇ASCII Punycode 轉 Unicode,如果你的輸入以「xn--」開頭(例如「xn--bcher-kva.example」),而你想把它解碼回 Unicode(例如「bücher.example」)。
  4. 點擊「Convert」來處理這個網域。這個工具會在每個句點處,把網域拆成幾個標籤(例如「bücher」與「example」),分別對每個標籤做編碼或解碼,並為非 ASCII 標籤加上或移除「xn--」前綴。舉例來說,在 ASCII 模式下,「例子.測試」會變成「xn--fsqu00a.xn--0zwm56d」。
  5. 檢查結果是否正確。這個工具會分別顯示每個轉換後的標籤,讓你能確認編碼或解碼是否套用正確。特別是當網域含有符號或混合文字系統時,請留意有沒有非預期的字元,或外觀相似的字元。
  6. 複製結果,使用「Copy」按鈕。這個工具只會複製轉換後的網域(例如「xn--bcher-kva.example」),不會加上協定或結尾的斜線。
  7. 驗證結果,並對照你的目標系統確認。舉例來說:
    • 如果你編碼一個網域是為了用在 DNS 上,把 Punycode 版本提交給你的註冊商或 DNS 服務商,並確認它被接受。
    • 如果你解碼一個網域是為了檢查,把解碼出來的 Unicode 拼寫,拿去對照預期的組織與文字系統做交叉核對,以避免同形異義字攻擊。

常見的轉換情境與範例

輸入(Unicode) Punycode(ASCII) 使用情境
bücher.example xn--bcher-kva.example 向要求 ASCII 輸入的註冊商,註冊一個德文網域。
mañana.com xn--maana-pta.com 為一個西班牙文網站設定 DNS 紀錄。
例子.測試 xn--fsqu00a.xn--0zwm56d 為了用在憑證簽署請求(CSR)中而編碼一個中文網域。
παράδειγμα.δοκιμή xn--hxajbheg2az3al.xn--jxalpdlp 檢查電子郵件中收到的一個希臘文網域是否有釣魚風險。
☃-⌘.example xn----dqo34k.example 測試符號與表情符號在 IDN 中是如何被編碼的(注意:許多註冊機構會封鎖符號)。

上表顯示了不同的文字系統與符號,在 Unicode 與 Punycode 之間是如何轉換的。請注意,雖然這個工具支援所有 Unicode 字元,但某些註冊機構,可能會拒絕含有符號、表情符號,或混合文字系統的網域。在信任一個轉換後的網域之前,請務必先查閱你所使用註冊商的 IDN 政策。舉例來說,含有雪人與指令符號的網域(「☃-⌘.example」)編碼後會變成「xn----dqo34k.example」,但許多註冊機構,會因為它含有非標準字元而封鎖這樣的網域。Punycode 轉換工具只負責執行編碼,不會強制套用特定註冊機構的規則,因此驗證的責任在於你自己。

限制與安全考量

Punycode 轉換工具,是為了逐一標籤地轉換網域名稱而設計的,並不是用來處理完整網址或任意文字。為了確保符合 RFC 3492,並防止誤用,它強制執行了幾項限制。第一,這個工具會拒絕含有協定(http://)、路徑(/shop)、連接埠(:8080)、查詢字串(?id=123),或片段(#section)的輸入。這些元件並不屬於網域的一部分,也無法由 Punycode 處理。第二,這個工具會在拆分標籤之前,先把 Unicode 句點(某些中日韓文字中使用的句號)正規化成 ASCII 的句點,但它不會執行完整的 Unicode 正規化(例如 NFC 或 NFKC)。這代表這個工具產生的結果,可能與套用了額外正規化步驟的瀏覽器或註冊機構不同。第三,這個工具會拒絕格式錯誤的輸入,例如空白標籤、無效的 Unicode 純量值,或超過 1,000 個碼位的編碼序列。這些防護機制能防止處理上的錯誤,但也可能導致這個工具,在某些其他系統能接受的網域上失敗。

處理 Punycode 時,安全性是一個關鍵的考量點。解碼一個「xn--」網域,會顯露出它的 Unicode 表示形式,但這並不保證這個網域是安全或合法的。同形異義字攻擊,利用來自不同文字系統、外觀相似的字元,來製造出看起來與可信任網域一模一樣的網域。舉例來說,「аррӏе.com」(西里爾字母)解碼後,會得到與「apple.com」(拉丁字母)相同的 Punycode,但它其實是由不同實體控制的另一個網域。Punycode 轉換工具並不會偵測或警告這類攻擊——它只執行可逆的編碼步驟。請務必獨立驗證一個解碼後網域所屬的組織與文字系統。舉例來說,如果你收到一封電子郵件,裡面連結到「xn--80ak6aa92e.com」,把它解碼成「apple.com」(西里爾字母),並辨識出這是一次釣魚攻擊嘗試。此外,某些註冊機構,會套用情境規則或封鎖清單,來防止濫用性的網域,因此一個語法上有效的 Punycode 網域,在註冊時仍可能被拒絕。在信任最終的 ASCII 名稱之前,請務必向具有權威性的使用端(例如註冊商、瀏覽器,或憑證授權單位)驗證它。

對開發者來說,這個工具的實作細節值得留意。它處理的是 Unicode 碼位,而不是 UTF-16 的半個編碼單元,確保輔助字元(例如表情符號)維持完整。Bootstring 演算法使用固定的 RFC 3492 常數(基數 36、tmin 1、tmax 26 等),把非 ASCII 碼位編碼成長度可變的差值,並在處理過程中,用一個自我調整的偏差值持續調整。這個工具內建算術溢位檢查,以防範無效輸入,而它的輸出,在所宣告的原始 Punycode 慣例下是確定性的。不過,它並不會複製瀏覽器所使用的 UTS #46 對映,或情境相關的規則,因此正式環境的系統,可能還需要額外的前置處理。如果某個註冊商拒絕接受轉換後的網域,請依循他們的 IDN 政策處理,而不要盲目地更動字元。舉例來說,有些註冊機構,要求網域必須使用特定的文字系統,或封鎖某些字元,即使那些字元在 Punycode 中是有效的。

如果你正在權衡各種選項,把 Punycode 轉成文字:安全地解碼 xn-- 網域這篇文章有詳細說明。

如果你正在權衡各種選項,把 Punycode 轉成 Unicode:讀懂 xn-- 標籤這篇文章有詳細說明。