34

UTF-8 でエンコードされたファイルから BOM を削除する方法はありますか?

すべての JSON ファイルが UTF-8 でエンコードされていることは知っていますが、JSON ファイルを編集したデータ入力担当者が BOM 付きの UTF-8 として保存しました。

Ruby スクリプトを実行して JSON を解析すると、エラーで失敗します。58 以上の JSON ファイルを手動で開き、BOM なしで UTF-8 に変換したくありません。

4

5 に答える 5

37

ruby >= 1.9.2 では、モードを使用できますr:bom|utf-8

これはうまくいくはずです(jsonと組み合わせてテストしていません):

json = nil #define the variable outside the block to keep the data
File.open('file.txt', "r:bom|utf-8"){|file|
  json = JSON.parse(file.read)
}

BOM がファイルで使用可能かどうかは問題ではありません。


File#rewindAndrew は、 BOM では使用できないと述べました。

巻き戻し機能が必要な場合は、位置を覚えて次のように置き換える必要がありrewindますpos=

#Prepare test file
File.open('file.txt', "w:utf-8"){|f|
  f << "\xEF\xBB\xBF" #add BOM
  f << 'some content'
}

#Read file and skip BOM if available
File.open('file.txt', "r:bom|utf-8"){|f|
  pos =f.pos
  p content = f.read  #read and write file content
  f.pos = pos   #f.rewind  goes to pos 0
  p content = f.read  #(re)read and write file content
}
于 2011-10-15T20:42:45.690 に答える
28

したがって、解決策は、gsub を介して BOM を検索して置換することでした。文字列のエンコードを強制的に UTF-8 にし、正規表現パターンを強制的に UTF-8 でエンコードしました。

http://self.d-struct.org/195/howto-remove-byte-order-mark-with-ruby-and-iconvhttp://blog.grayproductionsを見て解決策を導き出すことができました。ネット/記事/ruby_19s_string

def read_json_file(file_name, index)
  content = ''
  file = File.open("#{file_name}\\game.json", "r") 
  content = file.read.force_encoding("UTF-8")

  content.gsub!("\xEF\xBB\xBF".force_encoding("UTF-8"), '')

  json = JSON.parse(content)

  print json
end
于 2011-02-16T02:00:04.530 に答える
10

File.readメソッドとメソッドでエンコーディングを指定することもできますが、モードCSV.readは指定しません。read

File.read(path, :encoding => 'bom|utf-8')
CSV.read(path, :encoding => 'bom|utf-8')
于 2013-05-10T16:02:57.600 に答える
5

「bom|UTF-8」エンコーディングは、ファイルを一度だけ読み取った場合はうまく機能しますが、私のコードで行っていたように、File#rewind を呼び出すと失敗します。これに対処するために、次のことを行いました。

def ignore_bom
  @file.ungetc if @file.pos==0 && @file.getc != "\xEF\xBB\xBF".force_encoding("UTF-8")
end

これはうまくいくようです。他に注意すべき同様のタイプの文字があるかどうかはわかりませんが、巻き戻したり開いたりするたびに呼び出すことができるこのメソッドに簡単に組み込むことができます。

于 2014-11-14T20:28:28.973 に答える