首页 > 解决方案 > 如何克服 Excel CSV 编码的噩梦:使用 Ruby on Rails 从 ASCII-8BIT 到 UTF-8 的“\xEF”

问题描述

我正在尝试在 Rails 中解析 CSV 文件,除了保存在 Excel 中的任何内容(使用版本 16.26 进行测试)之外,对于 Windows 和 Mac(保存在 Numbers 和 Google 工作表中的 CSV 可以正常工作)。任何带重音的字符都会产生"Encoding::UndefinedConversionError: "\xEF" from ASCII-8BIT to UTF-8".

Excel 声称它以 UTF-8 格式保存。

当我上传保存在 Excel 中的 CSV 时,我希望重音字符不会引发错误。

我尝试过的事情:

  1. 将读取编码设置为 bom|utf-8(根据BOM 链接)、utf-8、iso-8859-1、utf-16、windows-1252、ascii-8bit (并在数组中循环遍历其中的每一个一个失败然后将其从阵列中删除)

  2. 当前代码使用 ISO8859-1:UTF-8 应该以 ISO8859-1 读取,然后以 UTF-8 编码

  3. 创建一个临时文件,将其转换为 binmode,CSV.parse(temp.path, encoding: "bom|utf-8") 根据此线程中的第一个答案

data = CSV.parse(csv, headers: true, header_converters: :symbol, skip_blanks: true, encoding: 'ISO8859-1:UTF-8')

如果我将 csv 保存在 Excel 中,然后将其保存在 google sheet 或 Numbers 中,然后上传它,它也可以工作。不幸的是,Excel 是我们用户上传的最常见的 CSV。

标签: ruby-on-railsrubyexcelparsing

解决方案


通过使用csvreader gem解决。内置的 CSV 解析器吸收了 rails。


推荐阅读