通过ruby进行字符串编码:安全地捕获用户输入

时间:2011-02-21 21:22:21

标签: ruby character-encoding

我搜索了一个简单的解决方案的高低。没有一个是简单的或“只是工作”。

首先,我不断收到此错误:

ArgumentError: invalid byte sequence in US-ASCII

这是因为用户正在从Microsoft Word复制和粘贴内容。我只想要一种方法来清理用户输入,以便它以适当的格式存储在数据库中,无论它们发送给我的格式如何。即使它完全破坏了他们的输入,我也不关心它。我只是想强制将他们的输入编码为以后不会抱怨的东西。

我试过了:

ic = Iconv.new('US-ASCII//IGNORE', 'US-ASCII')
safe_string = ic.iconv(unsafe_string)

执行上述操作并重新保存新字符串后,错误仍然存​​在。我试过了

safe_string = unsafe_string.force_encoding('US-ASCII')

仍然给我错误。

我也尝试过使用UTF-8。同样的事情。

在保存在数据库中之前,我是否可以做一些简单的事情来正确转换字符串?感谢。

1 个答案:

答案 0 :(得分:1)

我想我自己找到了解决方案。因此,如果您想强制将字符串编码为当前编码,您可以执行以下操作:

safe_string = unsafe_string.encode('US-ASCII', :undef => :replace)

但实际上,我建议使用UTF-8。我不确定为什么我的默认编码设置为US-ASCII,我假设rails将默认设置为UTF-8。无论如何,做到以下几点也解决了这个问题:

Encoding.default_internal = 'UTF-8'
Encoding.default_external = 'UTF-8'

这是放在初始化器中。如果有人有任何更好的建议,请告诉我。但我相信UTF-8是最流行的编码,我在几个网站上阅读它是推荐的编码。

感谢。