將表情符號轉換為 Punycode,會把網域標籤內部的 Unicode 碼位轉成一串以 xn-- 開頭、ASCII 相容的字串,因此像 ☕.example 這類名稱就會變成 DNS 相容的 xn--53h.example。Punycode Converter 會在你的瀏覽器中直接以 RFC 3492 Bootstring 演算法逐標籤進行轉換,將表情符號、帶變音符號的拉丁字母、希臘字母或 CJK 字元的非 ASCII 區段保留為單一、具確定性的 ASCII 編碼。每一個以點分隔的標籤會被獨立處理,這表示表情符號可以與像 mail 或 blog 這類純 ASCII 標籤並存而不會互相干擾。由於表情符號可能出現在基本多文種平面(像是 ☕ 範例位於 U+2615,遠低於 U+FFFF),也可能出現在 U+FFFF 以上的輔助平面,編碼器會逐碼位而非逐 UTF-16 半碼元進行迭代,因此對 Bootstring 演算法來說,單一表情符號碼位算作一個輸入字元,輔助平面中的碼位也能保持完整。對於相同的輸入,結果是可重現的,因為 RFC 常數——基底 36、tmin 1、tmax 26、skew 38、damp 700、初始偏差 72,以及初始碼位 128——都是預先固定而非由使用者控制的。Punycode Converter 在本機執行每一個步驟,因此你貼上的 URL 或主機字串絕不會離開這個頁面。

把表情符號轉成 Punycode 時會發生什麼事
Punycode 是讓非 ASCII 字元——表情符號、帶變音符號的拉丁字母、希臘字母、西里爾字母或 CJK 表意文字——能夠存在於主機名稱中而不破壞 DNS 的編碼層;過去的 DNS 僅接受 ASCII 字母、數字與連字號。RFC 3492 定義的 Bootstring 演算法是可逆的:它會把每一個非基本碼位打包成一串附加在標籤基本字元後面的 delta 尾段,並在你執行解碼器時將其還原。對於像 U+1F4A9 這類輔助平面中的表情符號來說,以碼位迭代代表每一個表情符號都算作單一輸入字元,而不是 JavaScript 引擎內部以 UTF-16 代理對呈現的那兩個碼元。
這個轉換器是以個別標籤為基礎來實作此邏輯。當你在選擇 Unicode-to-ASCII 後貼上 ☕.example,工具會在每一個 ASCII 點上切割字串,將任何 CJK 樣式的句點統一為相同的 ASCII 點,然後先處理 ☕。在那個標籤內部,由於含有至少一個非基本碼位,因此會加上 xn-- 前綴;第二個標籤 example 是純 ASCII,因此只會被轉為小寫後原樣輸出。最終結果是 xn--53h.example,可以直接交給 DNS 解析器、憑證授權中心,或任何需要 ASCII 相容格式的 URL 函式庫。
表情符號如何成為網域標籤
DNS 協定在遠早於表情符號出現之前,就已標準化於字母、數字與連字號組成的 ASCII 字元集。國際化網域名稱(IDN)藉由在離開用戶端應用程式之前,先以 Punycode 編碼每一個 Unicode 標籤來擴充這個系統。當註冊商儲存 ☕.example 時,註冊資料庫會保留 ASCII 格式的 xn--53h.example,並將 Unicode 形式公開用於顯示。為同一個主機簽發的憑證會以 ASCII 標籤進行比對,瀏覽器中的比對演算法則套用 IDNA 規則,決定哪些 Unicode 形式對應到該儲存的 ACE 標籤。
Punycode 既不是翻譯、也不是音譯,更不是安全檢查。把 xn--53h.example 轉回 ☕.example 雖然能還原拼字,但無法告訴你任何關於發音、擁有權或可信度的資訊。兩個看起來幾乎相同的字元——拉丁字母與全形變體,或是 Unicode Security Mechanisms 資料中收錄的易混淆字對——可能會編碼成不同的 Punycode 字串,或在對抗情境中編碼成視覺上的近似字。請把每一個解碼後的標籤當作需要目視檢查的素材,而不是具權威性的聲明。
如何把表情符號轉換為 Punycode
請依照下列步驟,使用 Punycode Converter 從含有表情符號的 Unicode 網域中,取得可安全用於 DNS 的 ACE 字串。
- 只將網域名稱貼到輸入框中。請去除任何通訊協定(https://)、路徑(/path)、查詢字串(?q=)、連接埠(:443)或片段(#section);這個工具預期的是以 ASCII 點分隔的純主機字串。CJK 樣式的句點會在切割輸入之前先被統一為一般的 ASCII 點。
- 選擇轉換方向。若你的輸入是可讀的 Unicode 網域(例如 ☕.example 或 🐱.cafe),請選擇 Unicode-to-ASCII。若你的輸入已經以 xn-- 開頭,而你想還原顯示時的拼字,請選擇 ASCII-Punycode-to-Unicode。
- 提交轉換。工具會在每一個點上切割輸入、識別每一個標籤,並使用固定常數 base 36、tmin 1、tmax 26、skew 38、damp 700、初始偏差 72,以及初始碼位 128,對每個標籤執行 RFC 3492 Bootstring。
- 不只讀取結果中的第一個標籤,而是讀取每一個標籤。任何含非基本碼位的標籤都會加上 xn-- 前綴;已經是純 ASCII 的標籤則會被轉為小寫後原樣輸出。如果表情符號出現在多個標籤中,每個標籤都會被獨立轉換。
- 使用複製控制項來複製轉換後的網域。輸出內容僅涵蓋已轉換的主機;複製的文字中不會附加通訊協定、結尾斜線或查詢參數。
- 以最終會使用這段字串的系統來驗證結果。將 ASCII 形式交給 URL 函式庫,或貼到目標註冊商的控制面板,以確認它能被接受、長度符合資格,並在前往解碼後的 Unicode 形式前檢查是否有近似字元。
如果轉換器回報錯誤而非結果,最常見的原因包括內嵌了通訊協定、兩個連續點所產生的空標籤、夾帶空白字元、非 Unicode 純量值,或是某個標籤合併後的碼位總數超過一千個。
解讀輸出:xn-- 前綴與標籤邊界
Bootstring 演算法會把標籤開頭所有基本 ASCII 字元原封不動地保留,再為每一個非基本碼位附加一段長度可變的 delta 尾段。因此 xn-- 前綴只是一個標記,而不是酬載;它向消費者表示這個標籤的其餘部分必須經過解碼。像 blog 或 mail 這類純 ASCII 標籤不會帶有 xn--,會原樣保留;只有含有至少一個非基本碼位的標籤才會獲得這個前綴。
由於標籤是以點切割並獨立處理的,因此混用表情符號與純 ASCII 並不困難。以 🐶.my.blog 為例,轉換器會產生三個輸出標籤:一個對應表情符號的 xn-- 標籤,接著是維持小寫不變的 my,最後是維持小寫不變的 blog。xn-- 之後的字元數會有所不同,因為每個非基本碼位會在編碼尾段中佔去一個 delta;輔助平面的表情符號與基本平面的帶變音符號字母,各自都只佔用一個 delta,即使它們的 UTF-16 寬度並不相同。
| RFC 3492 常數 | 作用 | 轉換器使用的值 |
|---|---|---|
| Base | 基本碼位數與數字字母表大小 | 36 |
| tmin | 可變長度整數的最小偏差門檻 | 1 |
| tmax | 可變長度整數的最大偏差門檻 | 26 |
| Skew | 在每個插入步驟之間套用的調整值 | 38 |
| Damp | 用於偏差成長的阻尼因子 | 700 |
| Initial bias | 編碼或解碼開始時的偏差 | 72 |
| Initial code point | 第一個非基本碼位的索引 | 128 |
這些常數無法透過轉換器介面調整。如果你更改它們,即使輸入相同也會產生不同的 ACE 字串,因此為了可攜性,必須沿用 RFC 的預設值。算術溢位檢查會保護 delta 的乘法與權重累積,即使編碼器在輸入極大時可能陷入迴圈,也能讓輸出保持有限。
拿到轉換後的字串後該怎麼做
請將轉換器的輸出視為原始的 RFC 3492 標籤轉換結果。然而,瀏覽器引擎與大多數具備 IDNA 意識的函式庫會在委派給 RFC 3492 之前,先執行 Unicode 技術標準 #46 的映射、標準化與情境規則,這代表它們最終的 ACE 標籤可能會與這個工具的輸出相差幾個字元。當這種情況發生時,函式庫才是主機實際儲存在線上內容的真相來源,而註冊商公布的 IDN 政策才是該標籤是否可註冊的真相來源。如果註冊商拒絕某個標籤,請遵循該註冊商的政策,而不是隨意調整字元以圖取得接受。
在註冊商與 URL 函式庫對 ASCII 形式達成共識之後,請在前往解碼後的 Unicode 網域之前,先檢查它是否有同形異義字(homograph)風險。來自不同書寫系統的兩個字元可能看起來幾乎一模一樣,而單純的轉換並不會標示出這種衝突。請將目視檢查搭配對營運該網域之組織的獨立查證,以及對連線時實際交涉出的憑證內容進行仔細審視。Bootstring 本身的技術定義收錄於 RFC 3492,其中固定了上述常數與可變長度整數編碼方式。
限制與轉換器不做的事
這個轉換器專注於每個標籤一次的可逆轉換,並拒絕執行相關的其他操作。只能貼上網域名稱——通訊協定、路徑、連接埠、查詢字串與片段都不在處理範圍內。空標籤、兩個連續點、xn-- 序列中格式錯誤的數字、無效的 Unicode 純量值,以及碼位數超過一千的輸入,都會以明確的錯誤被拒絕,而非部分處理。此工具不會連線 DNS、執行 WHOIS 查詢、測試註冊可用性、在 CJK 句點合併之外進行 Unicode 標準化、套用 UTS #46 映射,也不會解析百分比編碼。即使是在解碼模式下,它也只處理帶有 xn-- 前綴的標籤;從未被編碼器修改過的標籤會被原封不動地保留。
這些限制是有意為之。這個可逆編碼層的設計目標是小到足以讓你能驗證它的行為,卻又大到足以讓你能把輸出直接交給負責 URL 解析、IDN 政策與安全政策且符合標準的下游系統。若需要更完整的 IDN 教學——涵蓋標準化、近似字清單與憑證處理——請參閱專屬指南:將網域轉換為 Punycode 以相容 DNS。語法上編碼完成的標籤仍可能太長、被保留、遭到封鎖或已被註冊,因此請在把最終的 ASCII 名稱視為可部署之前,先以具權威性的接收端進行驗證。