ROT47 編碼解碼器採用一組可逆的替代規則,在固定 94 個字元的範圍內,將從驚嘆號(字碼點 33)到波浪號(字碼點 126)之間所有可列印的 ASCII 字元各旋轉 47 個位置,這就是為什麼單一動作就能同時編碼與解碼,而無需選擇金鑰、方向或獨立的模式。這種旋轉是確定性的,並保持位置不變,因此這個工具最好被理解為一張替代對映表,而不是一個會重新排序、捨棄或重新編碼字元的轉換。任何人在面對一段文字使用 ROT47 時,其實都在決定兩個實務問題:可列印 ASCII 的範圍是否與他們打算轉換的字串相符,以及他們的使用情境是否能被任何有經驗的讀者立刻反轉的規則所滿足。第二個問題比第一個更重要,因為選錯工具的類別,產生的結果看似正確,卻在資料離開瀏覽器的那一刻就失效了。本指南剩下的部分將帶你走過這兩項決策,以及在瀏覽器中執行這套替代規則的確切步驟,並說明你應該預期可列印 ASCII 範圍所帶來的界線。

ROT47 編碼解碼器實際上採取什麼做法
可列印 ASCII 的範圍恰好包含 94 個字碼點,從 33 到 126,如 Unicode 基本拉丁文圖表 所示。ROT47 將該範圍內的每個值位移 47 個位置,再以 94 為模數進行迴繞。因為 47 是 94 的一半,每個受支援的字元都會與另一個受支援的字元配對,再次套用這個運算會讓每個值走完完整的 94 步循環,因此回到原值。這種自反(self-inverse)特性正是為什麼在 ROT47 編碼解碼器 上同一個按鈕就能同時處理編碼與解碼,也說明了為什麼這個工具不會暴露金鑰欄位、位移滑桿或編碼/解碼切換鈕。
這套對映規則被精確定義,因此即使不信任特定實作也能重現。對於輸入中的每個 Unicode 字碼點,從 ASCII 33 到 126 之間的值會被對映到 33 加上 ((值減 33 加 47) 模 94)。空格(字碼點 32)剛好落在旋轉區間之外,會原封不動地複製,這就是為什麼輸出中仍可看到單詞之間的空格。Tab、換行符,以及所有 126 以上的字碼點都會依原樣複製,因此帶有變音符號的字母、CJK 文字與表情符號都能原樣通過,不會被迫轉成 ASCII 或被切成 UTF-16 半字。實作上會使用類似 ECMAScript 字串 codePointAt 的程序來逐一處理 Unicode 字碼點,而不是以位元組索引,因此輔助平面字元與代理對都能保持完整。
依照任務選擇做法
選擇正確做法的第一步,是明確說出你從這次轉換真正需要的是什麼。ROT47 很適合用於輕度的劇情遮罩、可逆的論壇謎題、課堂上的替代密碼示範,以及字元處理管線的快速檢查。它不適合用於任何需要機密性、完整性、身份驗證或抵抗頻率分析的情境,因為這套替代規則本身就是自身的反函式,任何認出這個模式的讀者只要再執行一次就能還原。
如果你的目標是在讀者主動選擇之前,把一段文字擋在隨意捲動的視野之外,那麼 ROT47 既方便又直覺。如果你的目標是把一段文字擋在沒有掌握特定秘密的人之外,那麼 ROT47 就是錯誤的工具,這時應該選擇像 AES 線上加密 頁面那類以密碼為基礎的加密工具,而 密碼產生器 可以用來提供底層金鑰。同樣的邏輯也適用於憑證儲存、API token 與個人資料——這些東西根本不應該通過任何無金鑰的編碼流程。
另一個決策點是輸入的字元集。如果你的字串混合了英文字母、數字、標點符號,以及 URL 或 shell 的特殊符號,那麼 ROT47 涵蓋整個可列印 ASCII 區間的特性,就比僅處理字母的密碼更具優勢。如果你的字串是純散文,並希望結果在視覺上仍可閱讀,那麼 ROT13 通常更合適,因為它會保留所有非字母字元,而 ROT13 編碼解碼器 正好提供這樣的行為。如果你的字串是二進位或傳輸格式,那麼你需要的完全是另一類工具,例如處理一般承載資料的 Base64 編碼/解碼,或處理 percent-encoded 值的 URL 解碼器。在這些選項之間抉擇,主要取決於周邊系統的期待,而不是哪一種密碼「比較好」。
三個步驟即可編碼或解碼文字
- 將你想轉換的精確文字貼到輸入欄位;貼上時空格與非 ASCII 字元會原樣保留,且該欄位不會自動修剪或正規化內容。
- 選擇 Apply ROT47,並從輸出區複製產生的可列印 ASCII 替代結果。
- 若要解碼,請把 ROT47 的輸出再次貼回同一個輸入欄位,再選擇一次 Apply ROT47;因為這套對映是自反的,第二次執行就會還原為原始文字。
如果還原後的文字與原始文字不一致,最常見的原因是兩次操作之間的中間環節修改了標點、把直引號轉成智慧引號,或重寫了換行符號。這個工具本身並不會變更、重新排序或重新編碼任何落在可列印 ASCII 區間之外的內容,因此任何偏差都指向複製或傳輸處理上的問題,而不是替代規則出錯。同樣的自反特性也在相關的 自反指南 中有記載,只是從不同角度說明同一套推理。
將 ROT47 與相關做法比較
| 做法 | 變更的字元 | 單一金鑰即可還原 | 承載秘密 | 典型用途 |
|---|---|---|---|---|
| ROT47 編碼解碼器 | 所有可列印 ASCII (33–126) | 可以,自反,不需金鑰 | 否 | 劇情遮罩、課堂示範、管線測試 |
| ROT13 編碼解碼器 | 僅 ASCII 字母 (A–Z, a–z) | 可以,自反,不需金鑰 | 否 | 論壇劇情標記、僅字母謎題 |
| Caesar 密碼解碼器 | 僅 ASCII 字母,可設定位移 0–25 | 使用相同位移即可 | 否 | 古典密碼研究、可設定的字母位移 |
| AES 線上加密 | 完整 UTF-8 承載資料 | 需使用密碼 | 是(密碼即為秘密) | 敏感資料的已驗證加密 |
值得注意的差異在於範圍與目的。ROT47 會同時變更數字、括號與標點符號,連同字母一起處理,因此輸出看起來像雜訊而非文字;ROT13 則完全不動其他字元,使結果仍可閱讀。Caesar 密碼是 ROT13 在僅限字母範圍內的可參數化版本,當你想在固定字母表中比較多個位移值時相當實用。AES 需要密碼,提供已驗證的加密,也是這張表格中唯一提供機密性的項目,因此它與其他三者屬於不同的安全類別。
此做法保留與變更了什麼
在可列印 ASCII 區間內,每個字元都會被旋轉,包括逗號、括號、數字與符號。這是它與 ROT13 之間刻意的差異,也是首次使用時常見的意外:一串數字經過來回處理後並不會保持原樣,因為每個數字都會被對映到同一個 94 字元區間內的另一個字元。這個區間正好是 33 到 126,而字碼點 32(空格)剛好落在它之外,這就是為什麼空格、Tab 與換行符都會留在原本的位置。實作上會逐一處理 Unicode 字碼點,區間外的所有內容都會在不做任何正規化的情況下原樣複製,並且不會切開輔助平面字元或轉換編碼。
替代規則的一個具體例子是 Hello 這個字。在可列印 ASCII 區間內對每個字母進行旋轉,會產生 w6==@;把這串結果再用同一條規則送回去,會逐字元地得到 Hello,因為這套旋轉是自身的反函式。對於任何可列印 ASCII 的輸入,這種單步可逆性都成立,這也正是為什麼 ROT47 編碼解碼器上一個 Apply 按鈕就能涵蓋兩個方向,同時說明了為什麼任何試圖單獨「解碼」ROT47 的中介工具都是多餘的。
ROT47 做法的界線
在你貼上大段文字之前,這個做法有三個值得了解的硬性界線。第一,工具在你的瀏覽器中處理輸入,並將大小限制為 200,000 個 Unicode 字碼點,以保持互動式轉換與複製的流暢;超過這個量的內容應該切成小塊處理,或改用其他工具。第二,空白的輸入會被拒絕,因為它不會產生任何有用的轉換,所以無論哪個方向都需要非空字串。第三,因為標點符號也會被旋轉,輸出可能包含在 URL、HTML、shell、正則表達式或標記語言中具有特殊意義的字元。在未進行跳脫處理的情況下,把這類輸出複製到另一種語法中,可能會改變接收端的解讀方式,而這個頁面只回傳純文字,並未聲明其輸出對任何特定傳輸情境是安全的。
最後一條界線,是選擇做法時最關鍵的一條:這裡沒有秘密。任何認出 ROT47 的人,只要再執行一次相同的操作就能還原,這在相關的自反指南中已被記錄為自反特性。這項特性也說明了為什麼這個工具不適合用來保護憑證、個人資訊或任何敏感訊息,並說明了為什麼在任何工作流程中出現時,它都應該被視為一種謎題編碼而非安全工具。在這些限制之內使用,這個做法是可預期、可重現的,並且只要再執行一次 Apply 就能輕鬆驗證。
想深入了解,請參閱 如何使用 UTF-8 編碼/解碼器。