【PHP】メール送信時の文字化け関連(引き続き)

  • このエントリーをはてなブックマークに追加

先日の投稿(【PHP】Errors-Toが文字化けの原因になっている可能性について)で、文字化けについて苦労したお話を書きましたが、その後の展開についてです。

とりあえず本文の文字化けについては解消したのですが、次はタイトルが文字化けするとの連絡。

色々と修正したところ、続いて「途中から文字化けする」という連絡が…
これがまた厄介で…

「38バイト目(74 文字)で文字化けが発生する」

というページがそこそこの量ヒットします。

が!

検索で上位にヒットする記事が全て「ポイントを押さえていない」という事実が発覚。
色々と調べて、なんとか現時点では解消している様子です。

詳細はこちら( http://www.cpa-lab.com/tech/0153 )をご確認いただければと思いますが、要点だけまとめておきます。

  1. mb_internal_encodingの文字コード
  2. mb_encode_mimeheaderに渡す文字列の文字コード
  3. mime変換する最終文字コード

この3点を正しく認識しておく必要があるとのことです。
mb_encode_mimeheader、使ってないのですが…

そもそも「mb_convert_encoding」の定義は以下のとおり。

mb_convert_encoding ( mixed $val , string $to_encoding [, mixed $from_encoding = mb_internal_encoding() ] ) : mixed

$val:
変換したい文字列です。

$to_encoding:
どの文字エンコーディングに変換したいかです。

$from_encoding:
変換前の文字列エンコーディングを記述します。
‘auto’を指定すると、自動判定してくれます。
正確には’auto’を記述すると「ASCII,JIS,UTF-8,EUC-JP,SJIS」に展開されます。

第2引数が「エンコード先」のはずなのですが、これとmb_internal_encodingの文字コードが一致してないと文字化けするという不思議…

一応、解消されてはいるのですが…
どうにも仕様と合致していません。

引き続き、対策を検討する必要がありそうです。

以下追記

mb_encode_mimeheaderのマニュアル(https://www.php.net/manual/ja/function.mb-encode-mimeheader.php
を確認したところ、原因が推定できました。

上記マニュアル内に以下の記載があります。

str:
エンコードする文字列。 mb_internal_encoding() と同じエンコーディングにしなければいけません。

これ、ひょっとして…
「mb_convert_encoding」にも適用されるのでは…

であるならば、事前に「mb_internal_encoding」で文字コードを指定し、「$to_encoding」で再度同じエンコードを指定する必要があるという現象に説明がつきます。

すっきりしませんが、解消したということにしておきましょう…
わかりにくいので、また後日まとめなおします。

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*