当我们导入CSV数据时,如何消除“UTF-8中的无效字节序列”

我们允许用户通过csv导入数据(使用ruby 1.9.2,因此速度更快)。

作为用户数据,当然,可能没有适当的消毒。

当我们尝试在/ index方法中显示数据时,我们有时会得到错误“UTF-8中的无效字节序列”,指向我们的erb,在其中显示一个字段widget.name

当我们进行导入时,我们希望强制传入的数据是有效的…是否有一个ruby运算符,将string映射到一个有效的utf8string,例如,像

goodstring = badstring.no_more_invalid_bytes 

“坏”数据的一个例子是char看起来像连字符,但不是常规的ascii连字符。 我们宁愿将non-utf-8字符映射到一个合理的ascii等价的(umlat -u去你的例子),但是我们可以简单地去掉字符。

因为这是导入大量的数据时,它需要一个快速的内置运算符,希望…


注意:这里是一个数据的例子。 该文件来窗口,是8位ASCII。 当我们导入它,并在我们的erb中,我们显示widget.name.inspect(而不是widget.name),我们得到:“Chains \ x96 Accessories”

所以数据的一个例子是实际上是8位代码96的“连字符”。

—当我们改变我们的csvparsing分配fldval = d.encode('UTF-8')它会引发这个错误:

 Encoding::UndefinedConversionError in StoresController#importfinderitems "\x96" from ASCII-8BIT to UTF-8 

我们正在寻找的是一种简单的方法,只要强制它成为有效的utf8,无论原始types如何,即使我们只是简单地删除非ascii。


虽然不像强制编码那样“好”,但是对于我们的导入时间来说,这是一个很小的代价:d.to_s.strip.gsub(/ \ P {ASCII} /,'')谢谢Mladen!

Ruby 1.9 CSV具有新的parsing器,可以与m17n一起使用。 parsing器与string中IO对象的编码一起工作。 以下方法::foreach, ::open, ::read, and ::readlines可以使用可选的选项:encoding你可以指定编码的编码。

例如:

 CSV.read('/path/to/file', :encoding => 'windows-1251:utf-8') 

将所有string转换为UTF-8。

您也可以使用更加标准的编码名称“ISO-8859-1”

 CSV.read('/..', {:headers => true, :col_sep => ';', :encoding => 'ISO-8859-1'}) 

我回答了一个类似的问题,该问题涉及使用非UTF-8编码读取1.9.2中的外部文件。 我认为这个答案会帮助你很多: 在Rails v3 / Ruby 1.9.2中的字符编码问题

请注意,您需要知道源代码,以便将其可靠地转换。 有像我在其他答案链接到的图书馆,可以帮助你确定这一点。

另外,如果你没有从文件中加载数据,你可以很容易地在1.9.2中转换string的编码:

 'string'.encode('UTF-8') 

但是,使用其他编码构buildstring的情况并不多见,如果可能的话,最好在读入到环境中时将其转换。

Ruby 1.9可以通过无效检测和replace来更改string编码:

 str = str.encode('UTF-8', :invalid => :replace) 

对于不寻常的string,例如从未知编码的文件加载的string,使用#encode而不是正则expression式,#gsub或#delete是明智的,因为这些都需要parsingstring – 但是如果string被破坏,它不能被parsing,所以这些方法失败。

如果您收到这样的消息:

 error ** from ASCII-8BIT to UTF-8 

那么你可能试图转换一个已经在UTF-8中的二进制string,你可以强制UTF-8:

 str.force_encoding('UTF-8') 

如果您知道原始string不是UTF-8二进制文件,或者输出string具有不正确的字符,请阅读Ruby编码音译。

 CSV.parse(File.read('/path/to/csv').scrub) 

如果您正在使用Rails ,则可以尝试使用以下方法修复它

 'Your string with strange stuff #@~'.mb_chars.tidy_bytes 

它将删除无效的utf-8字符并将其replace为有效的字符。 更多信息: https : //apidock.com/rails/String/mb_chars

将CSVfile upload到Google文件电子表格,然后将其重新下载为CSV文件。 导入和瞧! (在我的情况下工作)

据推测,谷歌将其转换为想要的格式..

来源: 使用UTF-8编码的Excel到CSV

只有这样做

 anyobject.to_csv(:encoding => 'utf-8')