Uuencode 編碼與 Uudecode 解碼

用經典的 Unix-to-Unix 格式編碼文字、十六進位位元組或檔案,或者把舊郵件、Usenet 存檔和指令碼中的 uuencode 資料塊解碼還原。

完全在瀏覽器中執行,不會上傳任何資料。

使用方法

  1. 選擇「編碼」生成 uuencode 資料塊,或選擇「解碼」從資料塊中還原資料。
  2. 如果結果要交給 uudecode 命令使用,請保留 begin 和 end 行並填寫檔名;關閉該選項則只輸出資料行。
  3. 輸入或貼上內容,也可以開啟檔案對其位元組進行編碼。
  4. 解碼時貼上完整的資料塊(如有 begin 行請一併貼上),然後複製結果或下載為檔案。

什麼是 uuencode?

uuencode 是 Unix-to-Unix encode 的縮寫,誕生於 1980 年前後,當時 Unix 機器之間通過只能傳輸文字的 UUCP 鏈路複製檔案。它把每 3 個位元組拆成 4 個 6 位的值,每個值加上 32,得到從空格到下劃線之間的可列印字元。由於郵件系統常常會刪掉行尾的空格,數值 0 通常寫成反引號(`)而不是空格,本工具也是這樣處理的。

uuencode 檔案有固定的格式:

  • 頭部行 begin 644 檔名,其中 644 是八進位的 Unix 檔案許可權(所有者可讀寫,其他人只讀),檔名是解碼時要建立的檔案。
  • 資料行,每行最多對應 45 個輸入位元組。行首是長度字元(32 加上位元組數,所以滿行以 M 開頭),後面最多跟 60 個編碼字元。
  • 一行只有一個反引號,表示 0 個位元組,最後是 end 行。

算上長度字元和換行符,輸出約比原資料大 38%。

uuencode 的現狀

在 MIME 出現之前,uuencode 是通過電子郵件傳送程式和圖片、在 Usenet 上釋出檔案的常用方式。到了 20 世紀 90 年代,MIME Base64 逐漸取代了它:uuencode 無法宣告內容型別,存在多個互不相容的變體,而且部分標點字元在 ASCII 與 EBCDIC 系統之間的閘道器上會被篡改,xxencode 正是為此而生。

如今在郵件和新聞組存檔、較老的 shell 指令碼以及遺留系統中,仍能見到 uuencode 資料。新專案請使用 Base64,整個檔案可以用 檔案轉 Base64。

在命令列和 Python 中使用 uuencode

# Shell(GNU sharutils):先寫輸入檔案,再寫 begin 行中的檔名
uuencode photo.jpg photo.jpg > photo.uu
uudecode photo.uu

# Python:每次處理最多 45 位元組的一行
import binascii
line = binascii.b2a_uu(b'hello', backtick=True)
binascii.a2b_uu(line)          # b'hello'

Python 舊的 uu 模組已在 Python 3.13 中移除,但 binascii 中的這兩個函式仍然可用。

編碼規格

字母表ASCII 32 到 96(空格到 `)
輸出體積約 137%,含行首長度字元
填充每行最多 45 位元組
標準POSIX uuencode
區分大小寫是

編碼範例

輸入 (UTF-8)輸出
Hello, World!begin 644 data.bin -2&5L;&\L(%=O<FQD(0`` ` end
Base64.isbegin 644 data.bin )0F%S938T+FES ` end
你好begin 644 data.bin &Y+V@Y:6] ` end

常見問題

為什麼 uuencode 文字里有反引號?

數值 0 本應對應空格,而行尾的空格在傳輸中經常丟失,所以包括本工具在內的許多編碼器改用反引號表示。解碼時兩種寫法都能識別。

begin 644 是什麼意思?

它標誌著編碼資料塊的開始。644 是還原後文件的 Unix 許可權(所有者可讀寫,其他人只讀),後面的詞是 uudecode 將要建立的檔名。檔名可以在選項中設定。

沒有 begin 行也能解碼嗎?

可以。如果沒有 begin 行,所有行都會被當作資料解碼;如果有,解碼會從 begin 行之後開始,到 end 行結束,資料塊前後的郵件正文等內容會被跳過。被郵件軟體刪掉的行尾空格也會自動補回。

uuencode 和 Base64 一樣嗎?

不一樣。兩者都把 3 個位元組變成 4 個字元,但 uuencode 使用不同的字元範圍,每行有長度字元,還有 begin 和 end 行。Base64 的結果不能當作 uuencode 解碼,反之亦然。