PHPの初心者に取り憑くという文字化けに祟られて悪戦苦闘の日々を過ごしてしまった。
ことの発端は、メールをパースするのにMailparse関数を使おうと思ったが、それはシステム環境をいじる必要があるためひとまず保留にして、自前でメールパーサーを制作しようと思い立ったことから始まった。
最初の遭遇は、メールの中身が読めるようにと以下のコードを作成して実行した時だった。
変換したメールを開いてみると一部関係ない箇所で文字化けが発生しているがパース対象の箇所については日本語が表示されているようなのでホッとした。まあこの程度なら見て見ぬふりを決めようと思ったが念のためいろいろと他のメールで試したところ、ごく僅かだが大事なデータの部分でも文字化けが出没するメールが見つかってしまった。残念ながらこの方式を採用するわけにはいかなくなった。それからというもの、様々な文字変換の修行が始まった。
やっと文字化けに遭遇しない回避対策のふたつにたどり着いた。
一つ目は、変換に使うmb_convert_encodingの自動判定(auto)は、あまり精度が高くなく偶に誤った判定をするためContent-Type: text/htmlで指定している文字セットを使うこと。
二つ目は、quoted_printableのコードが複数行に跨がってしまった場合改行コードとあいまって誤動作してしまう時があるため行単位でなくファイル一括で変換すること。
以上の二点を踏まえてコードを修正したら少なくともパース対象の箇所の文字化けは退治できた。もしかしたらまだ文字化けが出没するメールがあらわれるかもしれない。
取り敢えず次回はいよいよメールのパースの部分に取りかかろう。
ことの発端は、メールをパースするのにMailparse関数を使おうと思ったが、それはシステム環境をいじる必要があるためひとまず保留にして、自前でメールパーサーを制作しようと思い立ったことから始まった。
最初の遭遇は、メールの中身が読めるようにと以下のコードを作成して実行した時だった。
foreach (glob('mailbox/*.emlx') as $mailname ) {
// ファイル名の設定
$mailid = basename($mailname,'.emlx');
$filename = 'mailboxDecoded/'.$mailid.'.txt';
$fp = fopen($filename,'w');
$mail = file($mailname);
foreach($mail as $line) {
//メール形式のコードを解読
$mailtext = quoted_printable_decode($line);
//文字セットを自動判別してUTF-8文字セットに変換
$text = mb_convert_encoding($mailtext,'utf-8','auto');
//変換後のメールをファイルに書き出し
fwrite($fp,$text);
}
fclose($fp);
}
変換したメールを開いてみると一部関係ない箇所で文字化けが発生しているがパース対象の箇所については日本語が表示されているようなのでホッとした。まあこの程度なら見て見ぬふりを決めようと思ったが念のためいろいろと他のメールで試したところ、ごく僅かだが大事なデータの部分でも文字化けが出没するメールが見つかってしまった。残念ながらこの方式を採用するわけにはいかなくなった。それからというもの、様々な文字変換の修行が始まった。
やっと文字化けに遭遇しない回避対策のふたつにたどり着いた。
一つ目は、変換に使うmb_convert_encodingの自動判定(auto)は、あまり精度が高くなく偶に誤った判定をするためContent-Type: text/htmlで指定している文字セットを使うこと。
二つ目は、quoted_printableのコードが複数行に跨がってしまった場合改行コードとあいまって誤動作してしまう時があるため行単位でなくファイル一括で変換すること。
以上の二点を踏まえてコードを修正したら少なくともパース対象の箇所の文字化けは退治できた。もしかしたらまだ文字化けが出没するメールがあらわれるかもしれない。
取り敢えず次回はいよいよメールのパースの部分に取りかかろう。