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 つの配列またはオブジェクトで異なるエンコーディングを混ぜることはできません。
もやもや(´・ω・`)