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);