Uuencode と Uudecode

テキスト、16進数のバイト列、ファイルを従来の Unix-to-Unix 形式でエンコードします。古いメール、Usenet のアーカイブ、スクリプトに含まれる uuencode のブロックを、元のデータにデコードすることもできます。

すべてブラウザ内で処理され、データはアップロードされません。

使い方

  1. uuencode 形式のブロックを作成するには「エンコード」を、ブロックからデータを復元するには「デコード」を選択します。
  2. 結果を uudecode コマンドで扱えるようにするには、「begin / end 行」をオンのままにして「ファイル名」を入力します。データ行だけが必要な場合はオフにします。
  3. データを入力または貼り付けるか、ファイルを開いてそのバイト列をエンコードします。
  4. デコードする場合は、begin 行があればそれも含めてブロック全体を貼り付け、結果をコピーするか、ファイルとしてダウンロードします。

uuencode とは

uuencode は Unix-to-Unix encode の略で、テキストしか送れない UUCP 回線を通じて Unix マシン間でファイルをコピーしていた 1980 年ごろに生まれました。3 バイトごとに 6 ビットの値 4 つに分け、それぞれに 32 を足して、スペースからアンダースコアまでの印字可能な文字にします。メールシステムでは行末のスペースが削除されることが多かったため、このツールと同様に、値 0 はスペースではなくバッククォート(`)で表されます。

uuencode されたファイルは、決まった構成を持ちます。

  • ヘッダー行 begin 644 name。644 は Unix のファイルモードを 8 進数で表したもの(所有者は読み書き可能、その他のユーザーは読み取りのみ可能)で、name は作成されるファイルの名前です。
  • 入力で最大 45 バイト分のデータ行。各行は長さを示す文字(32 にバイト数を足したもの。そのため、満杯の行は M で始まります)で始まり、その後に最大 60 文字のエンコード済みの文字が続きます。
  • 0 バイトを意味するバッククォート 1 文字だけの行と、その後に続く end 行。

長さを示す文字と改行を含めると、出力は入力より約 38% 大きくなります。

現在の uuencode

MIME が登場する前は、プログラムや画像をメールで送ったり Usenet に投稿したりする際に uuencode を使うのが一般的でした。1990 年代に MIME の Base64 に置き換えられたのは、uuencode にはコンテンツタイプを示す手段がなく、互換性のない複数の派生版が存在し、一部の記号が ASCII と EBCDIC のシステム間のゲートウェイで書き換えられてしまうことがあったためです。最後の問題を解決するために作られたのが xxencode です。

uuencode されたデータは、現在でもメールやニュースのアーカイブ、古いシェルスクリプト、レガシーシステムで見かけることがあります。新しく使う場合は Base64 を、ファイル全体なら ファイル → Base64 を使ってください。

コマンドラインと Python での uuencode

# シェル(GNU sharutils):入力ファイル、続けて begin 行に書くファイル名
uuencode photo.jpg photo.jpg > photo.uu
uudecode photo.uu

# Python:一度に最大 45 バイトずつ、1 行単位で処理
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%
パディング1 行あたり最大 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 行がなくても uuencode をデコードできますか?

はい。begin 行がない場合は、すべての行をデータとしてデコードします。begin 行がある場合は、その次の行からデコードを始めて end 行で終了するため、メール本文などブロックの前後にあるテキストは無視されます。メールソフトによって削除された行末のスペースは、自動的に補われます。

uuencode は Base64 と同じですか?

いいえ。どちらも 3 バイトを 4 文字に変換しますが、uuencode は異なる文字の範囲を使い、各行に長さを示す文字を付け、begin 行と end 行を持ちます。Base64 の出力を uuencode としてデコードすることはできず、その逆もできません。