Uuencode

**uuencode** 這個名字是衍生自 "Unix-to-Unix encoding"，原先是 Unix 系統下將二進位的資料藉由 uucp 郵件系統傳輸的一個編碼程式，是一種二進位到文字的編碼。**uudecode** 是與 uuencode 搭配的解碼程式，uuencode/decode 常見於電子郵件中的檔案傳送以及 usenet 新聞群組和 BBS 的貼文等等。近來已被 MIME 所大量取代。

## 編碼程序

Uuencode 的編碼結果輸出檔案格式如下：

```
begin <輸入檔存取模式> <輸入檔名>
<編碼內容>
[<編碼內容>]
[...]
`
end
```

### <輸入檔存取模式>

沿用自 Unix 系統檔案存取權限模式，由三個八進位的數字組成，其構成形式為：

舉例而言：當<輸入檔存取模式>為 **666**，轉換成二進位碼為 **110110110**，也就是擁有人、群組以及其他人對於這個檔案都有讀取以及寫入的權力。

### <輸入檔名>

將編碼前的檔名填入。

### <編碼內容>

當檔案內容空無一物時，<編碼內容>就不存在。否則<編碼內容>會以下面形式出現：

```
<長度字元><編碼字元字串>
```

Uuencode 將輸入資料以每三個位元組為單位進行編碼，如此重複進行。如果最後剩下的資料少於三個位元組，不夠的部份用零補齊。這三個位元組共有 24 個 Bit，以 6-bit 為單位分為 4 個群組，每個群組以十進位來表示所出現的數值只會落在 0 到 63 之間。將每個數加上 32，所產生的結果剛好落在 ASCII 字元集中可列印字元（32 - 空白...95 - 底線）的範圍之中。

#### <長度字元>

每 60 個編碼輸出（相當於 45 個輸入位元組）將輸出為獨立的一行，每行的開頭會加上**長度字元**，除了最後一行之外，長度字元都應該是 'M' 這個 ASCII 字元（77=32+**45**），最後一行的長度字元為 **32 + 剩下的位元組數目**這個 ASCII 字元。

#### <編碼字元字串>

**<編碼字元字串>**是依照編碼結果依序填入，惟獨要注意一點：當 6-bit 的資料為零時，編碼應為_空白_這個字元，但是在 uuencode 中都用 _`_ 這個字元來取代，這是因為它們的末六 bit 都是 100.000。

#### 例外狀況

前面所說的只適用於使用 ASCII 字元集的電腦系統，有些比較舊型的電腦他們使用非 ASCII 字元集（如 EBCDIC 字元集）。要解決這個問題，Xxencode 是較為適切的編碼系統，它只使用到文數字字元集以及加減號字元。

## uuencode 編碼範例

### 簡短的例子

下面的表格顯示如何將 `Cat` 這三個 ASCII 字元編碼成 uuencode 的 `0V%T`：

因此 _Cat_ 這三個 ASCII 字元表示成 uuencode 的檔案形式：

```
begin 644 cat.txt
#0V%T
`
end
```

### 長範例

底下是引用自英文版的一段文字，將其存成 test.txt，引用文字如下：

_Each group of sixty output characters (corresponding to 45 input bytes) is output as a separate line preceded by an encoded character giving the number of encoded bytes on that line. For all lines except the last, this will be the character 'M' (ASCII code 77 = 32+45). If the input is not evenly divisible by 45, the last line will contain the remaining N output characters, preceded by the character whose code is 32 + the number of remaining input bytes. Finally, a line containing just a single space (or grave character) is output, followed by one line containing the string "end"._

使用 uuencode 編碼後的檔案為：

```
begin -666 test.txt
M16%C:"!G<F]U<"!O9B!S:7AT>2!O=71P=70@8VAA<F%C=&5R<R`H8V]R<F5S
M<&]N9&EN9R!T;R`T-2!I;G!U="!B>71E<RD@:7,@;W5T<'5T(&%S(&$@<V5P
M87)A=&4@;&EN92!P<F5C961E9"!B>2!A;B!E;F-O9&5D(&-H87)A8W1E<B!G
M:79I;F<@=&AE(&YU;6)E<B!O9B!E;F-O9&5D(&)Y=&5S(&]N('1H870@;&EN
M92X@1F]R(&%L;"!L:6YE<R!E>&-E<'0@=&AE(&QA<W0L('1H:7,@=VEL;"!B
M92!T:&4@8VAA<F%C=&5R("=-)R`H05-#24D@8V]D92`W-R`](#,R*S0U*2X@
M268@=&AE(&EN<'5T(&ES(&YO="!E=F5N;'D@9&EV:7-I8FQE(&)Y(#0U+"!T
M:&4@;&%S="!L:6YE('=I;&P@8V]N=&%I;B!T:&4@<F5M86EN:6YG($X@;W5T
M<'5T(&-H87)A8W1E<G,L('!R96-E9&5D(&)Y('1H92!C:&%R86-T97(@=VAO
M<V4@8V]D92!I<R`S,B`K('1H92!N=6UB97(@;V8@<F5M86EN:6YG(&EN<'5T
M(&)Y=&5S+B!&:6YA;&QY+"!A(&QI;F4@8V]N=&%I;FEN9R!J=7-T(&$@<VEN
M9VQE('-P86-E("AO<B!G<F%V92!C:&%R86-T97(I(&ES(&]U='!U="P@9F]L
M;&]W960@8GD@;VYE(&QI;F4@8V]N=&%I;FEN9R!T:&4@<W1R:6YG(")E;F0B
!+@``
`
end
```

## Uuencode 對照表

下面的表格顯示 uuencode 所使用到的 ASCII 字元集、6-bit 二進位碼以及十進位的對照。由上面 _Cat_ 的例子可以看出其第一個編碼為十進位的 16，對應下面表格 _uuencode 十進位表示_欄位，可以查出其 uuencode 的輸出碼為 _0_。

## 參見

* Base64
* BinHex
* MIME
* yEnc

## 參考資料

本條目部分或全部內容出自以 GFDL 授權發佈的《自由線上電腦詞典》（FOLDOC）。

## 外部連結

* UUDeview （頁面存檔備份，存於網際網路檔案館） - 適用於 Unix/Windows/DOS 等作業系統，使用 Base64, BinHex, uuencode, xxencode, ... 等方法編／解碼的開放源碼程式。
* 在線 uuencode 編碼與解碼（頁面存檔備份，存於網際網路檔案館）