背景
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 の形式を指定します。