ruby-on-rails 在从Windows-1252到UTF-8的转换中,将“\x9D”转换为UTF-8

lqfhib0f  于 2023-02-06  发布在  Ruby
关注(0)|答案(2)|浏览(213)

我已经在我的rails应用程序上创建了一个csv上传程序,但有时我会收到一个错误
在从Windows-1252到UTF-8的转换中,将"\x9D"转换为UTF-8
这是我的上传源:

def self.import(file)
  CSV.foreach(file.path, headers: true, encoding: "windows-1252:utf-8") do |row|
    title = row[1]
    row[1] = title.to_ascii
    description = row[2]
    row[2] = description.to_ascii
    Event.create! row.to_hash
  end
end

我正在使用unidecode gem(https://github.com/norman/unidecoder)来规范用户可能输入的任何愚蠢的字符。我已经遇到过这个错误几次了,但是不能确定如何修复它。我认为encoding: "windows-1252:utf-8"行可以修复这个问题,但是没有任何效果。
谢谢堆栈!

qmelpv7a

qmelpv7a1#

Windows-1252中没有9D字符(以及81、8D、8 F、90)。这意味着您的文本在Windows-1252编码中 * 不是 *。至少您的源文本已损坏。

s3fp2yjn

s3fp2yjn2#

我在阅读URL内容时遇到此错误:

table = CSV.parse(URI.open(document.url).read)

如果文件太大,我有条件获取的API将返回 GZIP
另一个恼人的事情是,Rails解压缩在一个有效的UTF8错误上失败了。
这不起作用:

ActiveSupport::Gzip.decompress(URI.open(document.url).read)

这确实奏效了:

Zlib::GzipReader.wrap(URI.open(document.url), &:read)

我的下一个问题是CSV.parse()读取整个blob,我有一行错误。

downloaded_file = StringIO.new(Zlib::GzipReader.wrap(URI.open(document.url), &:read))
tempfile = Tempfile.new("open-uri", binmode: true)
IO.copy_stream(downloaded_file, tempfile.path)
headers = nil
File.foreach(tempfile.path) do |line|
  row = []
  if headers.blank?
    headers = CSV.parse_line(line, { col_sep: "\t", liberal_parsing: true })
  else
    line_data = CSV.parse_line(line.force_encoding("UTF-8").encode('UTF-8', :invalid => :replace, :undef => :replace), { col_sep: "\t", liberal_parsing: true })
    row = headers.zip(line_data)
  end
  puts row.inspect
  ... # do a lot more stuff
end

哇。

相关问题