【PHP】UTF-8のBOMを削除する方法

  • 投稿 : 2017-02-11
当記事の内容とは微妙に違いますが、追記しておきます。
メモ帳で作成したUTF-8のテキストのBOMを削除したい場合は、メモ帳以外のエディターを用いて保存する以外にないかと思います。Windowsのメモ帳は必ず「BOMあり」になります。

function remove_utf8_bom($text)
{
    $bom = pack('H*','EFBBBF');
    $text = preg_replace("/^$bom/", '', $text);
    return $text;
}
php - How to remove multiple UTF-8 BOM sequences before ""? - Stack Overflow

文頭(^)のBOMコード($bom)をpreg_replaceで空文字(’’)に置換する関数です。これを使えば簡単にBOMを削除できます。

Excel 2016のUTF-8でのCSV出力

CSV (UTF-8) Support
In Excel
You asked for it! You can now save and open CSV files that use UTF-8 character encoding, and enjoy better support when working with
files that contain non-English data as well as ease of moving data to other applications.
What's new and improved in Office 2016 for Office 365 - Office Support

Excel 2016の最近のアップデートからUTF-8でのCSV保存できるようになったようなのですが、BOM付きみたいです。なしにできる設定がどこかにあるのかもわかりませんが見つからず。

そういえば、Windowsのメモ帳もBOMありで保存されて、BONなしにできないのでExcelもそうなのかも・・。

その他の方法?!

説明にBOM削除と書いてるのに、PHPコードがそうでないのを検索で見かけたのですが・・・。
PHPコードは以下と同じです。
8 bit extended ASCII?

You fell into a Hot Tub Time Machine, and you're back in the eighties. If you've got some form of 8 bit ASCII, then you might want to keep the chars in range 128-255. An easy adjustment - just look for 0-31 and 127

$string = preg_replace('/[\x00-\x1F\x7F]/', '', $string);
utf 8 - PHP: How to remove all non printable characters in a string? - Stack Overflow

たぶん、文字以外のコード(制御コード)を除くロジックがこれで、BOM削除にも使えるよね?!みたいな雰囲気です。
もしかすると、BOM付きのテキストをマージしたものを、あとからBOMを削除したいという場合とかにはつかえるのかも。

そうでない限りは、素直にファイル先頭のBOMコードを削除したほうが安全だと思う。
スポンサーリンク
タグ#PHP#code