2012-09-02 12 views
8

私のアプリ(Rails 3.0.5、Ruby 1.8.7)で、ファイルからCSVデータをインポートするインポートツールを作成しました。Rails 3、インポート前にCSVファイルのエンコーディングをチェックする

問題:CSVファイルをExcelからUTF-8エンコーディングでエクスポートするようにユーザーに依頼しましたが、ほとんどの時間は行いません。

インポートする前にファイルがUTF-8であるかどうかを確認するにはどうすればよいですか?それ以外の場合、インポートは実行されますが、奇妙な結果が生じます。インポートにはFasterCSVを使用します。悪いCSVファイルの

Exemple:

;VallÈe du RhÙne;CÙte Rotie; 

感謝。

答えて

22

Rubyの文字エンコード検出ライブラリCharlock Holmesを使用できます。

https://github.com/brianmario/charlock_holmes

それを使用するには、単にファイルを読み、detectメソッドを使用します。

contents = File.read('test.xml') 
detection = CharlockHolmes::EncodingDetector.detect(contents) 
# => {:encoding => 'UTF-8', :confidence => 100, :type => :text} 

それが正しい形式でない場合にも、UTF-8にエンコーディングを変換することができます:

utf8_encoded_content = CharlockHolmes::Converter.convert contents, detection[:encoding], 'UTF-8' 

これは再びそれをアップロードする前に、それ自体を行うために持っていることから、ユーザーが保存されます。それはあなただけUTF8を期待することを伝え、それがない場合は、エラーが発生します、明らかだ

+0

おかげで、私はそれをしようとします。 –

+0

これは完璧に動作しています!大きな感謝。 –

6

1.9の場合:

begin 
    lines = CSV.read('bad.csv', :encoding => 'utf-8') 
rescue ArgumentError 
    puts "My users don't listen to me!" 
end 
+0

これはいいですね。 1.8.7のための何もない? ;) –

+0

私にとっては文字列のエンコーディングは1.8と1.9の最大の違いですので、1.9のように思えます。 – pguardiario

+0

変数のfile_field_tagから直接ファイルを取得する場合は、その変数が {lines = CSV.read( 'bad.csv'、:encoding => 'utf-8')の代わりに@csv_fileであるとしましょう。 } 使用 {行= CSV.read(@ csv_file.tempfile、エンコード: 'utf-8')} –

関連する問題