LoginSignup
0
1

More than 5 years have passed since last update.

PHPでx-imap4-modified-utf7の文字列をUTF-8にエンコードする

Last updated at Posted at 2016-06-06

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-7textISO-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-utf7mb_convert_encodingだけでも変換が可能でした!

早速試すテスト

echo mb_convert_encoding('actionValue="imap://hogehoge.com/INBOX/00-&MMYwuTDI-/&MGYwWTBo-"', 'utf8', 'utf7-imap');

'actionValue="imap://hogehoge.com/INBOX/00-テスト/てすと'

ブラボー!! :tada:

imap_utf7_decodeundefinedとか言われてからバージョンの確認もしたのだけれどよくわからず……。
普通にmb_convert_encodingでエンコードが出来て助かりました。

Thunderbirdを何か使ったりとか、それ以外でもフォルダ名とかを扱うものと連携するときに必要になるかも。
&MMYwuTDI-」こんなのとか「&MGYwWTBo-」こんな文字をエンコードすることになったら一度この記事を思い出してみて下さい。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1