TRY AND ERROR

気になったこと、勉強したこと、その他雑記など色々メモしていきます。。Sometimes these posts will be written in English.,

PHPで作ったcsvをブラウザからDLさせてエクセルで開くときの文字化け

こんなときのベストプラクティスって何だろうか。。


例えば、DBから取ってきたデータをcsvにしてDLさせたい場合など、
UTF-8エンコードされたデータを扱うことが多いかと思います。

そのままDLさせてエクセルで開くと文字化けすますね。
エクセルがCP932(Shift_JIS)で開こうとするから起こる問題です。

エクセルで開いてから文字コードを指定して保存し直すのは
運用上手間がかかるので避けたい、といった場合にPHPで対処する際の
ベストプラクティスが知りたかったというのがきっかけ。。


ちなみに、今回はこんな感じでマルチバイトが入る可能性のあるデータを
エンコードするようにしました。

foreach ($ret as $row) {
    fputcsv($fp, array(mb_convert_encoding($row['col1'], "SJIS-win","UTF-8"),$row['col2'], $row['col3']));
}

mb_convert_variablesで配列を一気にエンコードしてもいいのですが、
マニュアルを見ると戻り値として変換前のエンコーディングを返したり、以下のような注記があったりと色々気持ち悪かったので使わず・・・

mb_convert_variables() は、エンコーディング検出のために Array または Object の文字列を結合します。これは、 エンコーディング検出は短い文字列では失敗する傾向があるためです。このため、 1 つの配列またはオブジェクトで異なるエンコーディングを混ぜることはできません。

マニュアル - mb_convert_variables


もやもや(´・ω・`)