在Rails中检测非ASCII字符

5
我在想是否有一种方法可以在Rails中检测非ASCII字符。据我所知,Rails默认不使用Unicode,而像中文和日文这样的字符在Unicode中有指定的范围。是否有一种简单的方法在Rails中检测这些字符?还是只需指定我所期望的字符范围即可?是否有相应的插件可用?谢谢!

4
“外国字符”具体指什么? é 算吗?ñµü呢?你是不是只想限制人们使用(7位) ASCII码 ?Rails对Unicode(最好是UTF-8)非常适用。 - mu is too short
是的,我正在尝试阻止所有这些字符。我该如何使用UTF-8?抱歉,我是新手。 - gerky
@mr_lu_kim:你想做哪一个? - Mechanical snail
Rails 中默认应该使用 UTF-8 编码。Ruby 的版本是哪个? - mu is too short
1.9.2,是不是更容易指定我允许的字符,还是屏蔽所有那些外语字符,比如中文、日文、法文等? - gerky
2个回答

7
所有表意文字编码都使用多个字节来表示一个字符,而Ruby 1.9+能够区分字节和字符(Ruby 1.8不行)。
您可以将字符长度与字符串的字节长度进行比较,作为快速检测器。但这可能并不完全可靠。
class String
  def multibyte?
    chars.count < bytes.count
  end
end

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

谢谢!但我使用正则表达式来匹配它们,比如匹配{Han}和其他内容。 - gerky
正则表达式比这更加可靠和精确,但这可能比正则表达式快得多。 - edgerunner
1
这个方法看起来相当聪明。谢谢! - Henley
1
简单而智能的方案——它将区分Unicode中的128个ASCII字符,这些字符需要一个字节,以及其他所有内容,包括所有外语字母和版权符号等。 (信息在此处:http://en.wikipedia.org/wiki/UTF-8和http://en.wikipedia.org/wiki/List_of_Unicode_characters) - Yarin

1

在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。15 年前处理非 ASCII 文本是一场噩梦,现在它已经很常见并且相当直接了。


如果您成功获取到的文本数据不是UTF-8编码,那么您有一些选择。如果编码是ASCII-8BITBINARY,那么您可以尝试使用s.force_encoding('utf-8')。如果最终得到的编码不是UTF-8ASCII-8BIT,那么您可以使用Iconv进行重新编码。

参考资料:


谢谢!另外,你知道如何在 RSpec 中测试过滤外文字符吗? - gerky
@mr_lu_kim:你测试 UTF-8 字符串操作的方式与测试其他字符串操作一样。只需要进行各种 utf8_string.mangle.should == utf8less_string 等测试即可。 - mu is too short

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接