開発したアプリなど一覧

Ruby で UTF-8 BOM 付きの JSON ファイルを読み込む

ある JSON ファイルを ruby のスクリプトより読み込もうとしたところ、パースエラーが発生した。ファイルを良く確認したところ先頭に UTF-8 BOM がついてる事を発見したのでそれを取り除いた上で JSON.parse を利用する事にした。

ruby で UTF-8 の BOM を取り除くには以下のように gsub で正規表現を用いて除去するのが楽だ。

str = str.gsub(/\xEF\xBB\xBF|\xEF\xBF\xBE/,"")

が、BOM を取り除こうとしたところ、以下のエラーが発生した。

example.rb:29:in `gsub': incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string) (Encoding::CompatibilityError)

UTF-8 の正規表現を ASCII-8BIT の文字列に利用する事はできないと言っているようだ。

どうやら JSON 文字列の文字コードがそもそも違ったらしい。なので以下のように予め文字コードを明示的に指定する必要があった。

str.force_encoding("UTF-8")
str = str.gsub(/\xEF\xBB\xBF|\xEF\xBF\xBE/,"")
JSON.parse(str)

これならちゃんと JSON として読み込む事ができる。

参考リンク

UTF-8のBOMの削除でハマる

Rubyで日本語が8bit asciiになってしまう場合 - Qiita

Sponsored Link

コメント