TL;DR
imap_utf7_decode()じゃなくてmb_convert_encoding()でOK。
そもそもx-imap4-modified-utf7とは?
どんなものか
x-imap4-modified-utf7という文字コードは、私もこの問題に直面するまでは訊いたことがありませんでした……。
少し調べてみると、どうも素のUTF-7というものの修正版であり、IMAP4を使ってフォルダ名なんかを表示するために改良されたものらしい?
どこで使われているのか
私がこの問題に直面したのは、Thunderbirdというメールクライアントソフトでのフィルタの設定です。
ここには、どのフォルダにメールを格納するのか。という情報を持つ部分があって、このフォルダ名のエンコードに使用されていました。
PHPで利用する
imap_utf7_decode()
ちょこっとググるとPHPにはimap_utf7_decodeという関数が用意されていることがわかります。
修正版
UTF-7のtextをISO-8859-1文字列に デコードします。
じゃあUTF-8で使いたい場合は、もう一度ISO-8859-1からUTF-8に変換しないといけないのかな。
とりあえず動かしてみるテスト
echo imap_utf7_decode('actionValue="imap://hogehoge.com/INBOX/00-&MMYwuTDI-/&MGYwWTBo-"');
PHP Fatal error: Call to undefined function imap_utf7_decode()
……えっ。
mb_convert_encoding()
実はこのx-imap4-modified-utf7、mb_convert_encodingだけでも変換が可能でした!
早速試すテスト
echo mb_convert_encoding('actionValue="imap://hogehoge.com/INBOX/00-&MMYwuTDI-/&MGYwWTBo-"', 'utf8', 'utf7-imap');
'actionValue="imap://hogehoge.com/INBOX/00-テスト/てすと'
ブラボー!! ![]()
imap_utf7_decodeがundefinedとか言われてからバージョンの確認もしたのだけれどよくわからず……。
普通にmb_convert_encodingでエンコードが出来て助かりました。
Thunderbirdを何か使ったりとか、それ以外でもフォルダ名とかを扱うものと連携するときに必要になるかも。
「&MMYwuTDI-」こんなのとか「&MGYwWTBo-」こんな文字をエンコードすることになったら一度この記事を思い出してみて下さい。