UTF-8のBOMの罠


先日、PHPでテキストファイルに記録されたテキストデータ(ファイル名群)を読み込み、得られたデータに則ってファイルを書き込みする処理を書いていたのですが、UTF-8のBOM付テキストにしてやられました。

まず、BOMとは何かですが、文字コードがUTF-8の場合に識別のため、ファイルの先頭に3バイト(0xEF 0xBB 0xBF)が追加されることを指します。

Windowsのメモ帳などでテキストファイルを編集すると必ずこのBOMデータが必ず付加されるそうです。

このBOMデータの存在に気づかずファイル名の読み込み→ファイル作成を行ったところ、見た目は普通のファイル名のファイルなのですが、Linux上で見ると同じファイル名が2つ。。。

<例>
# ll
test.txt ←実はファイル名頭にBOMがある
test.txt ←こっちはまともなファイル名

しかも、たちが悪いのが片方のファイルはファイル名が特定できないため、アクセス不可能というもの。。。 私の場合は、samba経由でファイルを削除しました。

インターネットで調べると意外と多くの方がBOMデータで同様のミスをしていることが判明しました。調べた限りだとPHP特有の問題っぽい感じ。

で、PHPでのBOMデータ削除の方法ですが、以下の方法で削除が可能です。

$fileName = "開くファイル名"; // 開くファイル名
$pointer = fopen($fileName, "r"); // ファイルを開く
$value = fgets($pointer);
$value = rtrim($value); // 改行コード除去
if($value == NULL)
{
break;
}
// BOMを取り除く処理
if($value[0] == chr(0xef) &amp;&amp; $value[1] == chr(0xbb) &amp;&amp; $value[2] == chr(0xbf))
{ // UTF-8 BOMを取り除く
$value = substr($value, 3);
}

私はこれに気づくまで半日無駄にかかってしまいました。この記事が皆さんの半日分の調査を節約することができれば幸いです。


この記事をシェアする

    Mask_Siva

    北の試される大地に生息しているSEです。
    楽しみながらプログラムを作ったり、ゲームで遊んだりしています。

    コメントをお待ちしております

    HTMLタグは利用できません

    Advertising



    新品/中古ゲーム販売 通販ショップの駿河屋

    Twitter

    仮面被り過ぎ@コンプレックス大佐
    @Mask_Siva

    • 今回もビックカメラから2,000円分の株主優待を頂戴しました〜。 日用品の購入にも使えるので重宝してます! #株式投資 #株主優待 #ビックカメラ https://t.co/hrHnONXWYj
      about 13分 ago
    • あ、そういえば本日行方不明だったプライベートの携帯電話は弊社事務所にありました! お騒がせいたしました。
      about 2時間 ago
    • 買った扇風機に温度計がついているのですが、不在の間のマイニング稼働で室温は31℃になっていました。。。 ドア全開、扇風機で送風して29℃らしい(笑
      about 2時間 ago

    BGM

    DEAD OR ALIVE (アニメ盤) - EP
    2 ホライズン -angela

    ↓の再生ボタンで再生できます
    色々な楽曲を試聴したいなら
    >>>こちら<<<

    Nico Nico Community

    Calendar

    2022年5月
    1234567
    891011121314
    15161718192021
    22232425262728
    293031 

    Archive

    My WIsh List

    Amazonで気になっている物をまとめています。

    「これは良かった!」「こっちの方がいいよ!」というものがあれば、教えてください<(_ _)>

    https://amzn.to/3oof0rZ