無駄に半日費やしました。
iconvってなんですかmb_convert_encodingが使えないから絶望してたらiconvで一発解決じゃないですかーやだー!
というどうでもいい前置きは置いといて、本題。
多言語な内容のcsvをPHPで吐き出すのに、どうしたら文字化けないか。ってことです。
答え。
BOM付きUTF-16LEでTAB区切りでペッってしましょう。
(余談ですが、TAB区切りはtsvって言うそうですね。)
これならWindowsでもMacでもダブルクリックでExcelさんに読み込ませてもちゃんと読み込まれます。
csv.php
<?php
header('Content-Encoding: UTF-16LE');
header('Content-type: text/csv; charset=UTF-16LE');
header('Content-Disposition: attachment; filename=file.csv');
$bom = chr(255) . chr(254); //BOM
//以下お好みのレイアウトでテキストを生成してください。
$txt = "あああ\tいいい\tううう\n";
$txt .= "えええええ\tお。";
//mb_convert_encodingが使えるならそっちでもいいでしょう。
echo $bom . iconv("UTF-8", "UTF-16LE", $txt);
exit();
とりあえずこれで、ブラウザでアクセスするとfile.csvをペッってしてくれます。
エスケープ処理とかは頑張ってください!