2012-09-02 19 views
8

Trong ứng dụng của tôi (Rails 3.0.5, Ruby 1.8.7), tôi đã tạo công cụ nhập để nhập dữ liệu CSV từ tệp.Rails 3, kiểm tra mã hóa tệp CSV trước khi nhập

Sự cố: Tôi đã yêu cầu người dùng của mình xuất tệp CSV từ Excel bằng mã hóa UTF-8 nhưng họ không làm hầu hết thời gian.

Tôi làm cách nào để xác minh xem tệp có phải là UTF-8 trước khi nhập không? Khác nhập khẩu sẽ chạy nhưng cho kết quả lạ. Tôi sử dụng FasterCSV để nhập.

dụ của tập tin CSV xấu:

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

Cảm ơn.

Trả lời

22

Bạn có thể sử dụng Charlock Holmes, một thư viện mã hóa ký tự phát hiện Ruby.

https://github.com/brianmario/charlock_holmes

Để sử dụng nó, bạn chỉ cần đọc các tập tin, và sử dụng phương pháp detect.

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

Bạn cũng có thể chuyển đổi bảng mã UTF-8 nếu nó không nằm trong định dạng đúng:

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

Điều này tiết kiệm cho người dùng cần phải làm điều đó bản thân trước khi tải lên nó một lần nữa.

+0

Cảm ơn, tôi sẽ thử nó. –

+0

Nó hoạt động hoàn hảo! Một lời cảm ơn lớn. –

6

Đối 1.9 đó là hiển nhiên, bạn chỉ nói với nó để mong đợi utf8 và nó sẽ nâng cao một lỗi nếu nó không phải là:

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

Điều này nghe hay. Không có gì cho 1.8.7? ;) –

+0

Không, nhưng với tôi mã hóa chuỗi là sự khác biệt lớn nhất giữa 1,8 và 1,9 vì vậy nó có vẻ như 1,9 là những gì bạn muốn. – pguardiario

+0

Nếu bạn nhận tệp trực tiếp từ file_field_tag ​​trong một biến, giả sử biến đó là @csv_file, trong trường hợp đó thay vì {lines = CSV.read ('bad.csv',: encoding => 'utf-8') } sử dụng {line = CSV.read (@ csv_file.tempfile, mã hóa: 'utf-8')} –

Các vấn đề liên quan