我们允许用户通过csv导入数据(使用ruby 1.9.2,因此它是fastercsv).

当然,作为用户数据,它可能没有得到适当的净化.

当我们试图以/index方法显示数据时,有时会出现错误"UTF-8中的无效字节序列",指向erb,在其中显示一个字段小部件.名称

当我们进行导入时,我们希望强制输入的数据有效...有没有ruby操作符可以将字符串映射到有效的utf8字符串,例如

goodstring = badstring.no_more_invalid_bytes

"坏"数据的一个例子是看起来像连字符但不是常规ascii连字符的字符.我们更愿意将非utf-8字符映射到一个合理的ascii等效字符(umlat-u到u表示exmaple),但我们可以简单地将字符剥离到.

因为这是在导入大量数据时,它需要是一个快速的内置操作符,希望...


注:以下是数据示例.该文件来自windows,是8位ascii码.当我们导入它并在erb中显示小部件时.名称判断(而不是widget.name)我们得到:

数据的一个例子是"连字符",实际上是8位代码96.

---当我们将csv解析改为赋值fldval=d.encode('UTF-8')时

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

我们正在寻找的是一种简单的方法,可以强制它成为有效的utf8,而不考虑原始类型,即使我们只是go 除非ascii.


虽然没有强制编码那么"好",但这对我们的导入时间有轻微的影响:

推荐答案

Ruby 1.9 CSV有了新的解析器,可以与m17n一起使用.解析器处理字符串中IO对象的编码.以下方法:::foreach, ::open, ::read, and ::readlines可以接受可选选项:encoding,您可以指定编码.

例如:

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

将所有字符串转换为UTF-8.

您还可以使用更标准的编码名称"ISO-8859-1"

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

Ruby相关问答推荐

我可以在Ruby中以散列的形式访问方法的关键字参数吗?

带有(*)签名的Ruby方法

这个#divmod 方法输出这个结果是做什么的?

如何判断 Ruby 文件是否为空?

Ruby 中的字符串是可变的吗?

模块中的实例变量?

Ruby 中是否有像 C 中一样的主要方法?

如何找到安装 Ruby Gem 的路径(即 Gem.lib_path c.f. Gem.bin_path)

按键对哈希进行分组并对值求和

Ruby 中的方法: objects与not?

从 Ruby 中的 DateTime 中减go n 小时

对于基于 GitHub 的 gem,强制Bundle 安装使用 https:// 而不是 git://

to_a 和 to_ary 有什么区别?

在 RSpec 测试期间 suppress 控制台输出

如何在 Ruby 符号中转义破折号-?

为什么 Ruby 的 Date 类会自动加载,但 DateTime 不会?

Ruby 中的自然语言处理

如何在 Ruby 中使用全局变量或常量值?

以小时为单位的时差

如何使用器重新安装 gem