PHP(Laravel)のシステムにUTF-8形式のCSVファイルをアップロードする際、BOMを削除する方法です。
BOM付きの場合とBOM付きでない場合、両方に対応する必要がありました。
解決策
$text = preg_replace("/^\xEF\xBB\xBF/", '', $text);
参考:BOMとは
- Byte Order Markの略
- テキストの先頭に付く
- CSVファイルを保存する際、Excelのバージョンや保存形式により、BOMが付く場合と付かない場合がある
- 16進法で「EF BB BF」と表される
- 「ファイルがUnicodeで書かれているか」や「エンディアンの形式」を判別するために付いている(※ただし、UTF-8ではエンディアンは関係ない)
余談:�
について
UTF-8の状態でデバッグした際、BOMは�
と出力されていました。
(ex.'日付'
の場合、'�日付'
)
これは代替文字(REPLACEMENT CHARACTER)と呼ばれるもの。
UTF-8だと U+FFFD とされる文字であり、他の文字コードからUTF-8に置き換えたときに該当する文字がないときなどに使用される
参考サイトより
参考サイト