【发布时间】:2016-06-28 14:10:05
【问题描述】:
我有以下两行代码,它们从 params 获取上传的 CSV 文件并返回 Contact 对象的哈希值。当我输入带有 UTF-8 编码的 CSV 时,代码工作正常。但是,如果我尝试使用另一种编码方式上传 CSV,它就会中断。如何调整代码以检测上传文件的编码并转换为 UTF-8?
CSV::Converters[:blank_to_nil] = lambda { |field| field && field.empty? ? nil : field }
csv = CSV.new(params[:file].tempfile.open, headers: true, header_converters: :symbol, converters: [:all, :blank_to_nil]).to_a.map {|row| row.to_hash }
这个问题不是重复的!我在这里看到很多其他问题都围绕着相同的编码问题,但这些问题的具体情况与我的情况不同。具体来说,我需要一种方法来转换从我的params 哈希生成的TempFile 的编码。我见过的其他解决方案包括编码String 和File 对象,以及将编码选项传递给CSV.parse 或CSV.open。我已经尝试过这些解决方案,但没有成功。
我尝试将编码选项传递给CSV.new,如下所示:
csv = CSV.new(params[:file].tempfile.open, encoding: 'iso-8859-1:utf-8', headers: true, header_converters: :symbol, converters: [:all, :blank_to_nil]).to_a.map {|row| row.to_hash }
我也试过这个:
csv = CSV.new(params[:file].tempfile.open, encoding: 'iso-8859-1:utf-8', headers: true, header_converters: :symbol, converters: [:all, :blank_to_nil]).to_a.map {|row| row.to_hash }
我也尝试过调整我的转换器,如下所示:
CSV::Converters[:blank_to_nil] = lambda { |field| field && field.empty? ? nil : field.encode('utf-8') }
我在这里寻找一种不需要用户将其 CSV 转换为正确编码的程序化解决方案。
【问题讨论】:
-
有一些用于检测字符编码的宝石很容易用谷歌搜索。
标签: ruby-on-rails ruby csv encoding utf-8