2015-05-21 13 views
5

Tôi đang tạo tệp CSV cần được mở và xem xét trong Excel khi chúng đã được tạo. Có vẻ như Excel yêu cầu mã hóa khác với UTF-8.Ruby: Cách tạo tệp CSV có mã hóa thân thiện với Excel

Dưới đây là cấu hình và hệ mã của tôi:

csv_config = {col_sep: ";", 
       row_sep: "\n", 
       encoding: Encoding::UTF_8 
      } 

csv_string = CSV.generate(csv_config) do |csv| 
    csv << ["Text a", "Text b", "Text æ", "Text ø", "Text å"] 
end 

Khi mở này trong Excel, các ký tự đặc biệt không được hiển thị đúng:

Text a Text b Text æ Text ø Text å 

Bất kỳ ý tưởng làm thế nào để đảm bảo mã hoá thích hợp?

+0

Hãy thử đặt '# encoding: UTF-8' làm dòng đầu tiên của tệp Ruby (thứ hai nếu bạn có dòng băm-băm,' #!/Usr/bin/env ruby'). Tôi tin rằng bạn đang * viết * trong UTF-8, nhưng tệp nguồn Ruby được lấy để được mã hóa thành US_ASCII. (Với Ruby 2.0+, mã hóa nguồn mặc định là UTF-8) – Amadan

+0

Tôi đang sử dụng 'ruby 2.0.0p247 (2013-06-27 phiên bản 41674) [x86_64-darwin12.4.0]' vì vậy tôi cho rằng điều đó có nghĩa là cài đặt của tôi đã sẵn sàng mặc định là UTF-8. – ChristofferJoergensen

+2

Không có kinh nghiệm với Ruby. Nhưng Excel có thể mở các tệp CSV phân cách bằng dấu chấm phẩy được mã hóa UTF-8. Nhưng tệp phải có BOM ngay từ đầu. Và cho dù dấu chấm phẩy có thể được sử dụng như dấu phân tách phụ thuộc vào miền địa phương hay không. Vì vậy, cách tiếp cận tốt nhất là sử dụng CSV phân tách tab lập trình và mã UTF-16LE được mã hóa. Điều này nên là miền địa phương nhất độc lập. –

Trả lời

7

Bạn nên chuyển mã hóa để ISO-8859-1 như sau:

CSV.generate(encoding: 'ISO-8859-1') { |csv| csv << ["Text á", "Text é", "Text æ"] } 

Đối với hoàn cảnh của bạn, bạn có thể làm điều này:

config = { 
    col_sep: ';', 
    row_sep: ';', 
    encoding: 'ISO-8859-1' 
} 

CSV.generate(config) { |csv| csv << ["Text á", "Text é", "Text æ"] } 

tôi đã cùng một vấn đề và mã hóa cố định.

+0

Câu trả lời ở trên phù hợp với tôi, nhưng chỉ sau khi tôi xóa các đối số 'col_sep' và' row_sep'. Chỉ cần 'mã hóa:' ISO-8859-1'' là tất cả những gì tôi cần.Đối với ngữ cảnh, vấn đề cụ thể mà tôi gặp phải là các ký tự 'é' xuất hiện dưới dạng' Ã © ' –

+0

Tốt bắt Greg, tôi sẽ cập nhật ví dụ mà không có ngữ cảnh. – joaofraga

5

Câu trả lời được bình chọn hàng đầu từ @joaofraga đã làm việc cho tôi, nhưng tôi đã tìm thấy giải pháp thay thế cũng hoạt động - không yêu cầu chuyển mã UTF-8 sang ISO-8859-1.

Từ những gì tôi đã đọc, Excel, thực sự có thể xử lý UTF-8, nhưng vì lý do nào đó, nó không nhận ra nó theo mặc định. Nhưng nếu bạn thêm BOM vào đầu dữ liệu CSV, điều này có vẻ khiến Excel nhận ra rằng tệp là UTF-8.

Vì vậy, nếu bạn có một CSV như vậy:

csv_string = CSV.generate(csv_config) do |csv| 
    csv << ["Text a", "Text b", "Text æ", "Text ø", "Text å"] 
end 

chỉ cần thêm một byte BOM như vậy:

"\uFEFF" + csv_string 

Trong trường hợp của tôi, điều khiển tôi đang gửi CSV như một tập tin, vì vậy đây là những gì bộ điều khiển của tôi trông giống như:

def show 
    respond_to do |format| 
    format.csv do 
     # add BOM to force Excel to realise this file is encoded in UTF-8, so it respects special characters 
     send_data "\uFEFF" + csv_string, type: :csv, filename: "csv.csv" 
    end 
    end 
end 

Tôi cần lưu ý rằng UTF-8 chính nó không req uire hoặc đề nghị một BOM tại tất cả các, nhưng như tôi đã đề cập, thêm nó trong trường hợp này dường như để đẩy Excel vào nhận ra rằng các tập tin đã được thực sự UTF-8.

+0

lừa đẹp có vẻ như nó hoạt động ngay bây giờ trên excel –

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