ある 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