ROT47 在 94 個可列印 ASCII 字元(從碼點 33 到 126)之間具有自我反函數特性,因此編碼字串的同一個操作也能解碼,而且在相同輸入上執行永遠會產生相同的輸出。因為旋轉距離 47 剛好是 94 個字元集大小的一半,每個支援的字元都會對應到唯一的配對字元,而將 ROT47 套用兩次會讓每個值走完整個 94 個位置的循環回到原點。它沒有金鑰、沒有種子、沒有會話狀態,也沒有模式切換,這表示單一確定性的確定性規則每次都會決定結果。任何對可列印 ASCII 區間內的碼點套用 33 加上(數量值減去 33 加上 47)模 94 運算的實作,在相同輸入下都會產生相同的輸出。這種可重現性是每個使用 ROT47 編碼解碼器 的可靠工作流程的基礎,同時也是為什麼把輸出複製到另一個系統時,如果該系統重新解讀標點符號或行尾符號,結果可能會悄悄改變的原因。

how do i repeat the same result when i use rot47 encoder decoder
使用 ROT47 編碼解碼器重複產生相同的結果

每個相同結果背後的固定規則

ROT47 作用在 Unicode 表中一條狹窄且定義明確的區段:碼點介於 33(驚嘆號)與 126(波浪號)之間的 94 個字元。官方的 Unicode 基本拉丁文表格記載了這些數值,而實作會依照 ECMAScript 規範中針對 String.prototype.codePointAt 的說明,一次處理一個 Unicode 碼點。對於落在該區間內的每個字元,工具會計算旋轉後的值;對於該區間外的每個碼點,工具則在不進行標準化的情況下直接複製原始碼點。沒有隨機成分、沒有每次會話的鹽值,也沒有可啟用的選用行為。在相同輸入上分別執行兩次 ROT47 編碼解碼器總是會產生相同的輸出,因為唯一的變數就是文字本身。

正是這種確定性讓你可以不儲存任何輸出就能「重複產生相同的結果」。如果你今天把字串 Hello, World! 貼到欄位中並套用 ROT47,得到的結果會和明天、在不同的瀏覽器、或在另一台機器上得到的結果相同。對應關係由可列印 ASCII 區間和固定的 47 偏移量所決定。只要輸入完全相同,且承載它的中介程式不會悄悄修改字元,這個轉換就能僅憑常數 47 和一張可列印 ASCII 對照表以手工重現。

每次都重現相同的輸出

隨時取得相同 ROT47 結果的確切程序簡短且明確。由於這個工具只有一項操作,同樣的三個步驟就能同時涵蓋編碼與解碼,會話之間也不需要記住任何設定。

  1. 把你想轉換的精確文字貼到輸入欄位中,包括任何你希望在輸出中保留的空格、定位字元或換行符號。
  2. 選擇 套用 ROT47,然後從輸出區域複製產生的可列印 ASCII 替代結果。
  3. 若要從 ROT47 字串重現原始內容,把輸出再貼回輸入欄位,然後再選擇一次 套用 ROT47——不需要額外的解碼器。

需要第二次操作是因為 ROT47 是自身的反函數。同一個按鈕就能處理兩個方向,而步驟 2 的輸出隨時都能用原始輸入重新走一遍這三個步驟從頭重建。如果你需要驗證已儲存的結果,把原始文字貼回去再套用一次操作;你就會逐字元地看到相同的替代結果。

ROT47 會轉換什麼、保留什麼

並非每個字元都會被旋轉。這個工具明確標示它的區間,讓有不同保留策略的實作不可能默默產生不同的結果。下表總結了一個忠實的 ROT47 實作唯一應該出現的行為。

字元類別碼點範圍ROT47 行為
空格32原樣複製不變
可列印 ASCII(字母、數字、標點、符號)33 到 126在區間內旋轉 47 個位置
控制字元(定位、換行、NUL、DEL)0 到 31 以及 127原樣複製不變
非 ASCII(帶腔調字母、CJK、表情符號)128 及以上原樣複製,不進行標準化

這個固定規則就足以獨立重現每個結果。如果某個工具對相同輸入回傳不同的值,這種差異幾乎都能追溯到兩個原因之一:該實作旋轉了 33 到 126 區間外的碼點,或是剪貼簿與工具之間的中介程式在替代執行前悄悄更動了某個字元。對應關係本身沒有變數,所以一旦確認區間正確,剩下的就只是文書作業。

為什麼相同輸入有時會產生不同輸出

ROT47 本身在多次執行之間不會改變,但圍繞它的系統可能會改變。即使演算法是固定的,以下幾種常見的干擾模式會破壞可重現性:

  • 智慧引號或長破折號的替換。捲曲的單引號(U+2019)落在可列印 ASCII 區間之外,會原樣保留,而直引號 U+0027 則會被旋轉。兩個視覺上相似的輸入會產生兩個不同的輸出。
  • URL、HTML 或 shell 的跳脫處理。把 ROT47 輸出貼到聊天程式、論壇文章或 shell 指令中,可能會改變標點符號被解讀的方式。&、<、> 和 " 這些字元都會在 ROT47 下被旋轉,而接收端系統可能會在儲存前把它們轉成實體或跳脫序列。
  • 行尾標準化。Windows 風格的 CRLF 和 Unix 風格的 LF 換行落在旋轉區間之外,但若複製操作把它們折疊或重寫,就會改變位元組數,並可能讓換行符號兩側在輸出面板中的內容產生位移。
  • 輸入大小超過 200,000 個碼點的限制。為了讓複製操作保持流暢,這個工具限制了互動式轉換的量;被截斷的貼文會產生一份較短的輸出,與完整字串應該得到的結果不符。

如果重複執行的結果看起來不對,請確認中介程式並未跳脫標點、轉換智慧引號或改寫行尾符號。那些是唯一實際會產生變化的來源;演算法本身在所有瀏覽器和會話之間都是穩定的。這些失敗模式的逐步說明可在 修正使用 ROT47 後看起來錯誤的結果 這篇文章中找到。

單一動作完成來回還原

確認結果可重現最簡短的方法就是做一次來回還原。取第一次操作的輸出,再貼回輸入欄位,然後再套用一次 ROT47。第二次操作的輸出應該逐字元等於原始輸入,因為自我反函數的特性保證了 47 加上 47 等於完整的 94 字元區間。

用字母 A(碼點 65)做一個具體示範:

  • 步驟 1:33 + ((65 − 33 + 47) 模 94) = 33 + ((32 + 47) 模 94) = 33 + (79 模 94) = 33 + 79 = 112。
  • 步驟 2:33 + ((112 − 33 + 47) 模 94) = 33 + ((79 + 47) 模 94) = 33 + (126 模 94) = 33 + 32 = 65。

碼點 65 是 A,112 是 p,所以一次操作把 A 變成 p,下一次操作又把 p 變回 A。這個數學對區間內每個可列印 ASCII 字元都同樣成立,這就是為什麼編碼字串的同一個操作也能解碼它。沒有金鑰、沒有模式切換,也沒有額外的按鈕。

對更長的字串來說,同樣的來回還原模式對每個支援的碼點都成立。標點會旋轉、數字會旋轉、大小寫字母都會旋轉,而周圍的空白字元和任何非 ASCII 內容則保持在原本的位置固定不動。輸出是確定性的,而輸入隨時都能再套用一次操作來還原。同一套自我反函數的邏輯在 ROT47 是否需要獨立的解碼器 這篇指南中有更詳細的剖析。