我要上传的CSV文件在将行导入数据库时会出现问题:
Encoding::UndefinedConversionError ("\xCC" from ASCII-8BIT to UTF-8)
最有效的方法是确保每一列都正确编码以放置在数据库中,或者被忽略。
最基本的方法是遍历每一行和每个字段并对字符串进行强制编码,但这似乎效率极低。有什么更好的方法来解决这个问题?
当前,它只是作为参数(:csv_file
)上传。然后,我按如下方式访问它:
CSV.parse(csv_file.download)
在模型中。
我假设在activestorage文件上调用CSV.parse时有一种强制编码的方法,但不确定如何执行。有任何想法吗?
谢谢!
答案 0 :(得分:0)
最新版本的ActiveStorage(6.0.0.rc1)添加了一个API,可以将文件下载到临时文件,然后可以从中读取。我假设Ruby将使用正确的编码从文件中读取。
https://edgeguides.rubyonrails.org/active_storage_overview.html#downloading-files
如果您不想升级到Rails 6的RC(就像我不想那样),则可以使用此方法将字符串转换为UTF-8,同时摆脱可能出现在其中的字节顺序标记您的文件:
wrongly_encoded_string = active_record_model.attachment.download
correctly_encoded_string = wrongly_encoded_string.bytes.pack("c*").force_encoding("UTF-8")