PHPでCSVファイルを書き出す時にBOMを付けて改行コードをCRLFにする
Streamってあんまり使わない…
こんな感じ。
<?php use App\Helpers\CrlfFilter; # Streamを開く $stream = fopen('php://output', 'w'); # BOMを付ける fputs($stream, pack('C*',0xEF,0xBB,0xBF)); # 改行コード変換フィルターを登録 stream_filter_register('CrlfFilter', CrlfFilter::class); # 登録したフィルターを適用 stream_filter_prepend($stream,'CrlfFilter', STREAM_FILTER_WRITE); #データ書き込み fputcsv($stream, [1,2,3]; # 終了 fclose($stream);
stream_filterって初めて使った。
ちなみにCrlfFilterは
こちらからコピペした
<?php namespace App\Helpers; /** * Class CrlfFilter * @package App\Helpers * @brief 改行コードをLFからCRLFにする */ class CrlfFilter extends \php_user_filter { public function filter($in, $out, &$consumed, $closing) { while ($bucket = stream_bucket_make_writeable($in)) { $bucket->data = preg_replace("/\n$/", '', $bucket->data); $bucket->data = preg_replace("/\r$/", '', $bucket->data); $bucket->data = $bucket->data . "\r\n"; $consumed += $bucket->datalen; stream_bucket_append($out, $bucket); } return PSFS_PASS_ON; } }