テキスト処理で一行目だけエラー?──原因は「BOM付きUTF-8」でした

先日,あるテキストファイルを使ってコマンド処理をしようとしたところ,一行目だけがどうしてもエラーになってしまうという現象に直面しました。

リストファイルの各行をもとにコマンドを生成し,コピペで実行しても一行目だけが動かない
不思議に思い,最終的には一文字ずつ文字コードを調査して原因を特定するに至りました。


原因は「FEFF」──UTF-8のBOM

調査の結果,一行目の先頭に「FEFF」という不可視の文字コード(BOM: Byte Order Mark)が入っていることがわかりました。
この「FEFF」は,UTF-8でBOMありとして保存されたファイルの先頭に付く特殊なコードで,Linux系OS(Fedoraなど)では扱いに注意が必要です。


なぜBOMが入っていたのか?

使用していたクラウドソフトが,スマホ表示に対応するため標準でBOM付きUTF-8形式でテキストを記憶しなければならない仕様になっていたため,Windows側のテキストアプリケーションの設定で「BOMあり」ファイルを作ってしまっていたからです。

その結果,テキスト処理スクリプトやシェルコマンドなどが,一行目を正しく認識できなくなっていたというわけです。


対処法と今後の教訓

テキストエディタで保存形式を確認

・UTF-8(BOMなし)で保存できるようにエディタの設定を見直す

最後に

一見ただの文字列ファイルでも,見えないバイト列が処理を妨げていることがあるという良い教訓になりました。
今後も,テキスト処理を行う際には,BOMの有無や文字コードの確認を忘れずに対応していきたいと思います。


同じように「なぜか1行目だけエラーになる」などの不可解な現象でお悩みの方がいれば,ぜひBOM付きファイルでないか確認してみてください。