2011-08-26 38 views
4

我想知道是否有一種方法來檢測Rails中的外來字符。Rails檢測外部字符?

我讀過Rails默認不使用Unicode,而外文字符(如中文和日文)則使用Unicode分配範圍。有沒有簡單的方法來檢測Rails中的這些字符?或者只是指定我期望的角色範圍?

有沒有插件?提前致謝!

+4

什麼算作「外來字符」? é'外國? '''','μ','ü'或'≠'怎麼樣?你想限制人們只是(7位)ASCII?對於Unicode(最好是UTF-8),Rails很滿意。 –

+0

是的,我試圖阻止所有這些字符。我如何使用UTF-8?對不起,這裏點菜。 – maru

+0

@mr_lu_kim:你想要做哪些? –

回答

6

所有的表意語言編碼使用多個字節來表示一個字符,和Ruby 1.9+知道字節之間的差異和字符(紅寶石1.8不是)

您可以將字符長度與字符串的字節長度作爲快速且髒的檢測器進行比較。這可能不是萬無一失的。

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

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

謝謝!但我使用正則表達式來匹配它們,比如{Han}和其他人匹配 – maru

+0

正則表達式比這更好,更簡單,更精確,但這可能比正則表達式要快得多。 – edgerunner

+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在Unicode方面效果很好,Rails和幾乎所有其他方面都很適用。處理非ASCII文本是15年前的一場噩夢,現在它非常普遍而且相當簡單。


如果您確實設法獲得不是UTF-8的文本數據,那麼您有一些選項。如果編碼是ASCII-8BITBINARY那麼你可能會與s.force_encoding('utf-8')脫身。如果您最終得到的不是UTF-8ASCII-8BIT,那麼您可以使用Iconv對其進行重新編碼。

參考文獻:

+0

謝謝!另外,你知道如何測試外來字符的過濾嗎?在rspec中? – maru

+0

@mr_lu_kim:與在RSpec中測試任何其他字符串操作的方式相同。你只需要做各種'utf8_string.mangle.should == utf8less_string'等等。 –