在Rails 3中替换智能引号,智能撇号和省略号的最佳方法是什么?

时间:2011-08-30 19:08:17

标签: ruby-on-rails ruby-on-rails-3 utf-8 character-encoding

我的应用程序允许用户输入文本。当他们从MS Word复制和粘贴时,它会粘贴智能引号,智能撇号和省略号。这些字符将保存到数据库中并导致问题。用正常引号(“),撇号(')和句点(...)替换这些非UTF-8字符的最佳方法是什么?

另外,您如何测试此功能?我添加了一个带有这些特殊字符的测试,并在文件顶部添加了# encoding: ISO-8859-1。特殊字符导致测试停止运行:/home/george/.rvm/gems/ruby-1.9.2-p180/gems/redgreen-1.2.2/lib/redgreen.rb:62:in 'sub': invalid byte sequence in UTF-8 (ArgumentError) ...显然redgreen gem与这些字符不兼容......?

感谢。

1 个答案:

答案 0 :(得分:-1)

您可以添加一个before_save方法,将您的文本转换为UTF-8对应的字符。如果你只有一个字段可能包含非UTF8字符,那么它很简单,如果你有很多字段,那么如果你动态迭代更改的文本/字符串字段并修复UTF-8问题会更好。无论哪种方式,您都需要使用String#encode。这是一个例子

before_save :fix_utf8_encoding

def fix_utf8_encoding
  columns = self.class.columns.select{|col| [:text,:string].include?(col.type)}.map{|col| col.name.to_sym}
  columns.each do |col|
    self[col] = self.self[col].encode('UTF-8', :invalid => :replace, :undef => :replace) if self[col].kind_of?(String) #Double checking just in case.
  end
end
private :fix_utf8_encoding

对于奖励积分,您还可以检查是否使用导轨更改了字段?帮助者修理之前。