CSV.parse的编码问题

时间:2012-04-07 11:19:55

标签: ruby-on-rails ruby fastercsv

我的目标是上传一个包含firstname和lastname行的文件,解析它并在db中为每一行创建Person模型。

我执行以下操作并且工作正常

file = CSV.parse(the_file_to_parse)
file.each do |row|
  person = Person.new(:firstname => row[0], :lastname => row[1])
  person.save
end

直到我的文件包含重音符号(法语单词),我得到

Encoding::UndefinedConversionError: "\xC3" from ASCII-8BIT to UTF-8:
INSERT INTO "people" ("created_at", "firstname", "lastname",
"updated_at") VALUES (?, ?, ?, ?)

处理此编码问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

您需要使用正确的编码打开csv文件。例如:

require 'csv'
require 'pp'

encoding = "ISO-8859-1"

csv = CSV.open "names.csv", "rb:#{encoding}"
csv.each do |line|
    puts "#{line[0]} #{line[1]}"
end

这是一个提示:它可能不是UTF-8。

您可以在irb:

中使用此命令查看您的ruby支持的编码列表
puts Encoding.list.map(&:to_s).sort

答案 1 :(得分:0)

尝试设置

# encoding: utf-8  

在ruby文件的顶部。或

export RUBYOPT=-Ku 
在rails s之前

答案 2 :(得分:0)

如果您对输入文件的编码一无所知,可以尝试ensure_encoding

它将尝试猜测输入编码并尝试(不适用于所有编码)将其转换为首选目标编码。