うまいぼうぶろぐ

linuxとhttpdとperlのメモ

メールのSubjectヘッダのエンコード

復習がてら。

日本語というかマルチバイトは使えないのでエンコードする必要あり。

形式

=???<エンコードされたヘッダ文字列>?=

日本語の場合

  • charset

ISO-2022-JP

  • method

BASE64ならB、Quoted-PrintableならQ。たいていBASE64

謎の文字列

ISO-2022-JP(JISコード)が使われる理由

欧米様式の7ビット規格のサーバやソフトを経由したら、1ビット分が破棄されるという事態になることがあります。これが、「文字化け」という現象です。(もし文字化けメールを受け取ったら、相手のメーラーの設定を確認してもらいましょう)そこで、この現象を避けるために、日本語の文字コードでも7ビットコードを使う方法が考え出されました。

ほう。

Base64 encode/decodeする方法

いろいろある。


実験してみた。

iso-2022-jp用のエンコード/デコード

端末の設定はutf8。nkfのデフォルトの出力は-jのJIS出力なので-j,-Jオプションはいらない、かも。

encode
$ echo 日本語テスト | nkf -W -M -j
=?ISO-2022-JP?B?GyRCRnxLXDhsJUYlOSVIGyhC

メーラで件名を"日本語テスト"にして送信、受信したメールのヘッダを確認。

Subject: =?ISO-2022-JP?B?GyRCRnxLXDhsJUYlOSVIGyhC?=

"=? ~~ ?="に囲まれた部分がBase64エンコードされた同じ文字列になっている。

decode
$ echo GyRCRnxLXDhsJUYlOSVIGyhC | nkf -J -mB -w 
日本語テスト

UTF8用のエンコード/デコード

encode
$ echo 日本語テスト | nkf -W  -M -w
=?UTF-8?B?5pel5pys6Kqe44OG44K544OI

メーラで件名を"日本語テスト"にして送信、受信したメールのヘッダを確認。

Subject: =?UTF-8?B?5pel5pys6Kqe44OG44K544OI?=
decode
$ echo 5pel5pys6Kqe44OG44K544OI | nkf -W -mB -w
日本語テスト