使用方法
- 選擇「編碼」生成 uuencode 資料塊,或選擇「解碼」從資料塊中還原資料。
- 如果結果要交給 uudecode 命令使用,請保留 begin 和 end 行並填寫檔名;關閉該選項則只輸出資料行。
- 輸入或貼上內容,也可以開啟檔案對其位元組進行編碼。
- 解碼時貼上完整的資料塊(如有 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.is | begin 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 解碼,反之亦然。