世界のやまさ

SEKAI NO YAMASA

BOM 付き UTF-8 から BOM を取りたい

Windows Azure Mobile Services から Android のサンプルアプリをダウンロードして IntelliJ でビルドしようとすると以下エラーが出た。

java: \65279は不正な文字です

BOM 付き UTF-8 だと起こるということが分かったので、BOM を削除しようとすると意外といい方法が無い。(vim -b で開いて削除するとか。手作業が多い)

今回行った作業をまとめておく。

BOM 付きかどうかの確認方法

file コマンドを使用するのが一番手っ取り早い。以下のように with BOM で出力される。

$ file *
ToDoActivity.java:    UTF-8 Unicode (with BOM) Java program text, with CRLF line terminators
ToDoItem.java:        UTF-8 Unicode (with BOM) C++ program text, with CRLF line terminators
ToDoItemAdapter.java: UTF-8 Unicode (with BOM) Java program text, with CRLF line terminators

BOM の削除 (Ruby 編)

Rubyワンライナーで解決出来ないか試してみた。 file コマンドの結果で ASCII って表示されているけど、元のファイルが日本語含まれていないからで、問題なさそうだった。

$ ruby -e 'print File.open("TodoItem.java", "r:BOM|UTF-8").read' > test.java
$ file *
ToDoActivity.java:    UTF-8 Unicode (with BOM) Java program text, with CRLF line terminators
ToDoItem.java:        UTF-8 Unicode (with BOM) C++ program text, with CRLF line terminators
ToDoItemAdapter.java: UTF-8 Unicode (with BOM) Java program text, with CRLF line terminators
test.java:            ASCII C++ program text, with CRLF line terminators

BOM の削除 (ツール 編)

環境設定で UTF-8 の BOM なしにして、Dock へディレクトリをドラッグアンドドロップしてあげると変換されました。

$ file *
ToDoActivity.java:    ASCII Java program text
ToDoItem.java:        ASCII C++ program text
ToDoItemAdapter.java: ASCII Java program text