バグ解消法、お役立ち情報など

CakePHP で UTF-8 BOM付き の CSV を出力する方法(CsvView Plugin)

logo

はじめに

CSVファイルを出力する際に、BOMをつけたいという要望があったため、方法を調べて実装しました。

「CsvView Plugin」というプラグインを使っています。

インストール方法などは公式ページを参照ください。

FriendsOfCake/cakephp-csvview

https://github.com/FriendsOfCake/cakephp-csvview

今回は、上記プラグインのインストールなどのセットアップは済んでいるという前提で進めます。

実装

以下の処理を実装します。

  1. 文字コードをUTF8にする
  2. ヘッダーに 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の書き出し方

https://alaki.co.jp/blog/?p=1260

バグ解消法、お役立ち情報など