PHP(Laravel)でCSVを読み込んだときに、最初のカラムに謎の文字化けが出現する問題。BOMが原因です

PHP

公開: 2020-09-28

更新: 2020-09-28

LaravelでCSVを読み込もうとしたときに上手く読み込めないことがありました。
エディタでファイルを確認してみると、1行目の先頭に文字化けしたデータが入っていました。

これはExcelでCSVをUTF-8で保存するとBOMというもの付属して保存されるようです。
BOMというのが付いていると1行目の先頭に3バイト付属され、文字化けとなって現れます。

文字コードの一種であるUnicodeにはBOM無しとBOM付きの2種類が存在します。BOMはバイトオーダーマーク(byte order mark)の略で、Unicodeで符号化したテキストの先頭に付与される数バイトのデータのことです。
https://uxmilk.jp/48923

解決方法

  • BOMを取り除いて保存
  • 正規表現でBOMを除去

BOMを取り除いて保存はオペレーション側で徹底しないといけないので、システム側でBOMを除去して制御したほうが良さそう。

BOMを取り除く正規表現

ファイル全体をテキストとして読み込んで置換処理を実行するか、CSVを配列にしてforeachで回し1行目のときのみ実行するなどして除去をする

//php

preg_replace('/^\xEF\xBB\xBF/', '', $field);

参考:【PHP】CSV読込備忘録 - Qiita