先日の投稿(【PHP】Errors-Toが文字化けの原因になっている可能性について)で、文字化けについて苦労したお話を書きましたが、その後の展開についてです。
とりあえず本文の文字化けについては解消したのですが、次はタイトルが文字化けするとの連絡。
色々と修正したところ、続いて「途中から文字化けする」という連絡が…
これがまた厄介で…
「38バイト目(74 文字)で文字化けが発生する」
というページがそこそこの量ヒットします。
が!
検索で上位にヒットする記事が全て「ポイントを押さえていない」という事実が発覚。
色々と調べて、なんとか現時点では解消している様子です。
詳細はこちら( http://www.cpa-lab.com/tech/0153 )をご確認いただければと思いますが、要点だけまとめておきます。
- mb_internal_encodingの文字コード
- mb_encode_mimeheaderに渡す文字列の文字コード
- 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」で再度同じエンコードを指定する必要があるという現象に説明がつきます。
すっきりしませんが、解消したということにしておきましょう…
わかりにくいので、また後日まとめなおします。