Rails检测外来字符?

时间:2011-08-26 05:23:15

标签: ruby-on-rails unicode character-encoding

我想知道是否有办法在Rails中检测外来字符。

我已经读过Rails默认不使用Unicode,而中文和日文等外来字符都用Unicode分配范围。有没有一种简单的方法来检测Rails中的这些字符?或者只是指定我期待的字符范围?

有插件吗?提前谢谢!

2 个答案:

答案 0 :(得分:6)

所有表意语言编码都使用多个字节来表示一个字符,Ruby 1.9+知道字节和字符之间的区别(Ruby 1.8不是)

您可以将字符长度与字符串的字节长度进行比较,作为快速且脏的检测器。但这可能不是万无一失。

class String
  def multibyte?
    chars.count < bytes.count
  end
end

"可口可樂".multibyte? #=> true
"qwerty".multibyte? #=> false

答案 1 :(得分:1)

使用1.9.2非常简单,因为正则表达式在1.9.2中基于字符,1.9.2从上到下知道字节和字符之间的差异。你在Rails中,所以你应该用UTF-8获得所有东西。令人高兴的是,UTF-8和ASCII重叠整个ASCII范围,因此当你有UTF-8编码文本时,你可以删除' ''~'之间的所有内容:

>> "Wheré is µ~pancakes ho元use?".gsub(/[^ -~]/, '')
=> "Wher is ~pancakes house?"

虽然没有理由去解决所有这些麻烦。 Ruby 1.9和Rails以及其他所有东西一样适用于Unicode。处理非ASCII文本是15年前的一场噩梦,现在已经很普遍且相当直接。


如果您确实设法获得非UTF-8的文本数据,那么您有一些选择。如果编码为ASCII-8BITBINARY,那么您可能可以使用s.force_encoding('utf-8')。如果您最终得到UTF-8ASCII-8BIT以外的其他内容,则可以使用Iconv对其进行重新编码。

参考文献: