我想知道是否有办法在Rails中检测外来字符。
我已经读过Rails默认不使用Unicode,而中文和日文等外来字符都用Unicode分配范围。有没有一种简单的方法来检测Rails中的这些字符?或者只是指定我期待的字符范围?
有插件吗?提前谢谢!
答案 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-8BIT
或BINARY
,那么您可能可以使用s.force_encoding('utf-8')
。如果您最终得到UTF-8
和ASCII-8BIT
以外的其他内容,则可以使用Iconv对其进行重新编码。
参考文献: