Posted at

コマンドラインでMIMEヘッダーをエンコード&デコードする方法

More than 5 years have passed since last update.


背景

MIME(マイム)とはインターネットの電子メールで様々なフォーマットを扱えるようにする規格のことです。MIMEによって電子メールにPDF、画像、動画など様々なドキュメントを添付することができます。

しかし、本来電子メールはUS-ASCIIしか使用できないため、メールのヘッダー部分にそのままマルチバイト文字を入れることはできません。そのため、現在の電子メールでは以下のような形式で文字列をエンコードして、ヘッダーに格納しています。


=?charset?encoding?encoded-text=?=


そこで、このようなフォーマットの文字列をコマンドラインでエンコード、デコードする方法について書いていきます。

こういうときに、nkf コマンドが大活躍します。

なお、MIME の説明については端折るのであしからず。


インストール

mac の場合


$ brew install nkf


エンコーディングの変換

MIMEの前に文字エンコーディングの変換について


  • nkf -w: UTF-8 に変換

  • nkf -e: EUC-JP に変換

  • nkf -s: Shift-JIS に変換

  • nkf -j: JIS(ISO-2022-JP) に変換


MIMEエンコード



UTF8文字列 → MIME エンコード

「ほげほげ」は UTF8 文字列として、UTF8のままMIMEエンコードするとします。



$ echo ほげほげ | nkf -M
=?UTF-8?B?44G744GS44G744GS?=

$ echo ほげほげ | nkf -MB
44G744GS44G744GSCg==

$ echo ほげほげ | nkf -MQ
=E3=81=BB=E3=81=92=E3=81=BB=E3=81=92


解説


  • nkf -M: Base64 で MIMEエンコードする

  • nkf -MB: Base64 で MIMEエンコードする


    • encoded text だけ取り出す



  • nkf -MQ: quoted-printable で MIMEエンコードする


    • encoded text だけ取り出す




UTF8文字列 → MIME エンコード(JIS)

次に、出力のエンコーディングをJISでMIMEエンコードします。

上で説明した通り、nkf -j オプションを加えるだけで簡単に実現出来ます。



$ echo ほげほげ | nkf -jM
=?ISO-2022-JP?B?GyRCJFskMiRbJDIbKEI=?=

$ echo ほげほげ | nkf -jMB
GyRCJFskMiRbJDIbKEIK

$ echo ほげほげ | nkf -jMQ
=1B=24B=24=5B=242=24=5B=242=1B=28B


MIMEデコード



$ echo "=?ISO-2022-JP?B?GyRCJFskMiRbJDIbKEI=?=" | nkf -w
ほげほげ

$ echo GyRCJFskMiRbJDIbKEI= | nkf -wmB
ほげほげ

$ echo "=1B=24B=24=5B=242=24=5B=242=1B=28B" | nkf -wmQ
ほげほげ


解説

nkf -m: MIME デコードする

入力が「=?charset?encoding?encoded-text=?=」の形式の場合、-m オプションなしでも自動でMIMEデコードしてくれます。便利ですね!

入力が encoded-text だけの場合、明示的に -m オプションと content-transfer-encoding の形式を指定します。