RFC 3492 Punycode 轉換會透過 Bootstring 演算法獨立處理每個網域標籤,這正是為什麼一次性貼上多標籤 IDN 網域時,可以同時處理所有標籤,也是任何批次 Punycode 工作流程的基礎。Punycode 轉換器將每個以點分隔的區段視為獨立標籤,以句點分割輸入,將 CJK 全形句點正規化為 ASCII 點,然後對每個標籤單獨執行編碼或解碼。由於演算法是本機、確定性的,且完全在瀏覽器中執行,因此您可以依序處理一長串網域、貼上含有多個標籤的單一網域,或將每個轉換結果複製到試算表、DNS 區域檔或憑證請求中,完全不需要與伺服器往返。範圍刻意設計得比完整的 URL 解析器更窄:此工具不接受通訊協定、路徑、連接埠、查詢字串或片段,因此此處的批次處理指的是透過相同的本機轉換器反覆處理批次標籤與批次網域,而不是批次的 URL 解析。

批次 Punycode 轉換:逐一標籤的方法
國際化網域名稱(例如 bücher.example 或 例子.測試.de)並非單一字串——它們是由點連接起來的標籤序列,每個標籤都會單獨轉換。當轉換器收到 bücher.example 時,它會以點分割,將第一個標籤編碼為 xn--bcher-kva,將第二個標籤保留為純 ASCII example,然後重新組合成以點分隔的輸出。這種逐標籤的行為正是讓多標籤網域能夠作為單一批次作業進行轉換的原因,而依照相同的逐標籤 IDN 轉換指南操作,是在一長串網域中重複此流程的自然方式。
Punycode 是一種表示法,而非翻譯。解碼器會顯示 ASCII 標籤的 Unicode 拼法,但不會唸出該字,也不會確認其擁有者。編碼器會將 Unicode 字碼點縮減為純 ASCII 形式(使用可變長度的 delta),但不會檢查結果是否已註冊、被封鎖或保留。清楚劃分這個界線,正是讓批次轉換可以安全地以指令碼處理的原因:相同的輸入總是會產生相同的輸出,而涉及政策、註冊機構或 DNS 的每個步驟都與轉換器無關。
如何批次轉換多標籤網域
- 開啟 Punycode 轉換器,將一個網域名稱貼到輸入欄位中。請勿加入 https://、www.、路徑、連接埠或查詢字串——此工具僅接受裸網域。
- 選擇方向:當標籤含有變音字母、CJK 或其他非 ASCII 字元時,選擇 Unicode-to-ASCII;當輸入以 xn-- 開頭時,選擇 ASCII-Punycode-to-Unicode。
- 點擊 轉換 並檢查輸出中每個以點分隔的標籤。ASCII 標籤保持小寫,非 ASCII 標籤在編碼時會加上 xn-- 前綴,而 xn-- 標籤在解碼時會移除前綴並顯示原始的 Unicode 拼法。
- 複製轉換結果並貼到目標系統中:DNS 區域檔、憑證簽署請求欄位、註冊商控制台,或試算表的某一欄。由於演算法是確定性的,每個儲存格都是獨立的。
- 對清單中的下一個網域重複操作。本機轉換沒有速率限制,因此批次反覆處理的瓶頸只有打字速度,以及每個網域 1,000 個字碼點的上限。
決定性輸出背後的 RFC 3492 常數
批次工作仰賴可重現性。同一個標籤執行兩次必須產生相同的 ASCII 字串,而今天能夠乾淨編碼的 Unicode 標籤,明天也必須編碼為相同的位元組。轉換器將 RFC 3492 Bootstring 常數固定下來,使得原始標籤轉換完全具有決定性,不受瀏覽器、地區設定或執行階段猜測影響:
| RFC 3492 常數 | 固定值 |
|---|---|
| base | 36 |
| tmin | 1 |
| tmax | 26 |
| skew | 38 |
| damp | 700 |
| initial bias | 72 |
| initial code point | 128 |
在這些常數固定的情況下,演算法會逐一處理 Unicode 字碼點而非 UTF-16 半段,因此 U+FFFF 以上的輔助字元得以保持完整。標籤中既有的 ASCII 字元會先被複製,接著將非基本字碼點編碼為可變長度的 delta,而偏差值會隨著數值處理而調整。偏差值的調整正是讓編碼後的標籤保持精簡的原因:它會移動編碼從一位數切換到兩位數的門檻,因此常見的腳本會使用較短的前綴,而罕見的腳本則會使用較長的前綴。算術溢位檢查會保護 delta 乘法與權重累加,當單一標籤含有數十個變音或 CJK 字元時,這一點格外重要。已驗證的測試案例涵蓋拉丁變音字母、希臘文、CJK、符號、單標籤與多標籤網域,雙向皆包含 bücher、mañana、例子、測試 與 παράδειγμα。如果您需要確認批次轉換結果是否與第三方程式庫或 DNS 實作相符,請將相同的標籤同時通過兩者,然後逐字元比對 ASCII 輸出;原始的 RFC 3492 標籤轉換才是契約規範,而非 UTS #46 對應或 IDNA 2008。
批次轉換器會拒絕的輸入
轉換器的範圍刻意設計得很窄,批次指令碼應該確切知道這個範圍的界線在哪裡。下表列出本機引擎在接受任何轉換執行之前接受與拒絕的內容。
| 輸入類型 | 結果 | 原因 |
|---|---|---|
| 裸網域名稱 | 接受 | 符合文件記載的範圍 |
| 含通訊協定、路徑或查詢的完整 URL | 拒絕 | 工具比瀏覽器 URL 解析器更窄 |
| 含有空標籤的網域(連續點) | 拒絕 | 空標籤無效 |
| 超過 1,000 個字碼點的輸入 | 拒絕 | 每個網域的大小上限 |
| 格式錯誤的 Punycode 位數 | 拒絕 | 無效的 Bootstring 輸入 |
| 無效的 Unicode 純量值 | 拒絕 | 超出範圍的字碼點 |
拒絕格式錯誤的輸入,正是讓批次執行保持誠實的原因。帶有損壞標籤的部分輸出比沒有輸出更糟,因為它可能悄悄流入 DNS 區域檔或憑證請求中,等到生產環境才失敗。同一條界線也會攔截常見的批次錯誤:貼上時前置了 https:// 的 URL、不小心將兩個網域串連在一起而沒有分隔符,或是尾端空白導致輸入超過 1,000 個字碼點的上限。每種情況都會在沒有部分輸出的情況下被拒絕,因此批次管線可以依結果分支,而不會收到半轉換的資料列。
安全地驗證批次 Punycode 輸出
有效的批次轉換並不代表該網域可以安全地註冊、託管或造訪。不同書寫系統的字元可能看起來幾乎一模一樣——西里爾字母的 а 與拉丁字母的 a 在視覺上無法區分,但會編碼為完全不同的 Punycode 標籤。轉換器僅提供原始的 RFC 3492 標籤轉換,因此請將它視為一個可逆的編碼步驟,並將安全性過濾、註冊機構驗證與同形異義字檢查保留在另一個層級。
生產環境的 URL 系統經常會在編碼之前套用 Unicode 正規化、上下文規則與 UTS #46 對應,而瀏覽器對於相同的 Unicode 輸入可能會產生不同的 ASCII 標籤,若這些規則與原始的 RFC 3492 不一致。請將轉換器的輸出視為文件記載的原始標籤形式,並交由符合標準的 URL 程式庫來處理完整的應用程式 URL。如果註冊商拒絕了轉換結果,請依照該註冊機構的 IDN 政策處理,而不是悄悄修改字元——語法上有效的標籤仍可能過長、被保留、被封鎖,或根本不可用。在解碼方面,點擊連結之前請仔細比對每個標籤、書寫系統與組織;解碼模式所顯示的 Unicode 拼法僅供參考,並非信任訊號。解碼會顯示 xn-- 標籤的拼法,但永遠不會告訴您該網域是否屬於它視覺上所模仿的組織。