CakePHP で UTF-8 BOM付き の CSV を出力する方法(CsvView Plugin)
はじめに
CSVファイルを出力する際に、BOMをつけたいという要望があったため、方法を調べて実装しました。
「CsvView Plugin」というプラグインを使っています。
インストール方法などは公式ページを参照ください。
FriendsOfCake/cakephp-csvview
https://github.com/FriendsOfCake/cakephp-csvview
今回は、上記プラグインのインストールなどのセットアップは済んでいるという前提で進めます。
実装
以下の処理を実装します。
- 文字コードを
UTF8
にする - ヘッダーに BOM を付与する
今回は以下のように実装しました。
Controller// CSV の ヘッダー (1つ目のヘッダーのみ BOM を付与する) $header = [ pack('C*', 0xEF, 0xBB, 0xBF) . 'id', 'name', ]; // 文字コードを UTF8 にする foreach ($header as $ht) { $_header[] = mb_convert_encoding($ht, 'UTF8'); } // CSV の データ $rowData = [ ['id' => 1, 'name' => 'taro'], ['id' => 2, 'name' => 'jiro'], ['id' => 3, 'name' => 'saburo'], ]; $data = []; foreach ($rowData as $key => $value) { $data[$key] = [ // 文字コードを`UTF8`にする mb_convert_encoding($value['id'], 'UTF8'), mb_convert_encoding($value['name'], 'UTF8'), ]; } // CsvView Plugin の使い方に従って変数に値をセットする $_serialize = 'data'; $this->response->withDownload('test_file.csv'); $this->viewBuilder()->setClassName('CsvView.Csv'); $this->set(compact('data', '_serialize', '_header'));
このように実装すると、UTF-8 BOM付きのCSVファイルを出力することができます。
参考
ExcelでBOM付きが無双するPHPでのCSVの書き出し方