UTF-8 でエンコードされたファイルから BOM を削除する方法はありますか?
すべての JSON ファイルが UTF-8 でエンコードされていることは知っていますが、JSON ファイルを編集したデータ入力担当者が BOM 付きの UTF-8 として保存しました。
Ruby スクリプトを実行して JSON を解析すると、エラーで失敗します。58 以上の JSON ファイルを手動で開き、BOM なしで UTF-8 に変換したくありません。
UTF-8 でエンコードされたファイルから BOM を削除する方法はありますか?
すべての JSON ファイルが UTF-8 でエンコードされていることは知っていますが、JSON ファイルを編集したデータ入力担当者が BOM 付きの UTF-8 として保存しました。
Ruby スクリプトを実行して JSON を解析すると、エラーで失敗します。58 以上の JSON ファイルを手動で開き、BOM なしで UTF-8 に変換したくありません。
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#rewind
Andrew は、 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
}
したがって、解決策は、gsub を介して BOM を検索して置換することでした。文字列のエンコードを強制的に UTF-8 にし、正規表現パターンを強制的に UTF-8 でエンコードしました。
http://self.d-struct.org/195/howto-remove-byte-order-mark-with-ruby-and-iconvとhttp://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
File.read
メソッドとメソッドでエンコーディングを指定することもできますが、モードCSV.read
は指定しません。read
File.read(path, :encoding => 'bom|utf-8')
CSV.read(path, :encoding => 'bom|utf-8')
「bom|UTF-8」エンコーディングは、ファイルを一度だけ読み取った場合はうまく機能しますが、私のコードで行っていたように、File#rewind を呼び出すと失敗します。これに対処するために、次のことを行いました。
def ignore_bom
@file.ungetc if @file.pos==0 && @file.getc != "\xEF\xBB\xBF".force_encoding("UTF-8")
end
これはうまくいくようです。他に注意すべき同様のタイプの文字があるかどうかはわかりませんが、巻き戻したり開いたりするたびに呼び出すことができるこのメソッドに簡単に組み込むことができます。