2012-06-12 36 views
1

我在使用Mongoid包含多字節字符時在MongoDB中保存記錄時遇到了問題。這是字符串:如何使用gsub替換ruby中的多字節字符?

a="Chris \xA5\xEB\xAE\xDFe\xA5" 

我首先將它轉換爲二進制,我再gsub這樣說:

a.force_encoding("BINARY").gsub(0xA5.chr,"oo") 

...的正常工作:

=> "Chris oo\xEB\xAE\xDFeoo" 

但似乎我不能使用chr方法如果我使用Regexp

a.force_encoding("BINARY").gsub(/0x....?/.chr,"") 
NoMethodError: undefined method `chr' for /0x....?/:Regexp 

任何人都有同樣的問題?

非常感謝......

+0

所有非ASCII字符與'OO'? –

回答

4

你可以做到這一點與插補

a.force_encoding("BINARY").gsub(/#{0xA5.chr}/,"") 

"Chris \xEB\xAE\xDFe" 

編輯:根據意見,在這裏,會將二進制編碼版本字符串轉換爲ASCII表示並對該字符串執行正則表達式

a.unpack('A*').to_s.gsub(/\\x[A-F0-9]{2}/,"")[2..-3] #=>"Chris " 

的[2 ..- 3]到底是擺脫年初[「和和尾隨」]的

注:剛剛擺脫特殊字符,你也可以只使用

a.gsub(/\W/,"") #=> "Chris" 
+0

更有意義的是,將chr應用於粘性事物,而不是正則表達式。 – DGM

+0

是的,它是有道理的!但是,如何使用正則表達式以避免明確指定每個字符串? – Cacofonix

+0

你想使用什麼樣的模式?你只需要將編碼的字符視爲常規字符,例如gsub(/#{0xA5.chr} {2} /,「」)只會在出現2次時替換0xA5 – peter

2

實際的字符串不包含文字字符\ xA5:這就是如何顯示字符否則是不可打印的(當字符串包含一個換行符ruby顯示你\ n)。

如果你想改變任何非ASCII的東西,你能做到這一點

a="Chris \xA5\xEB\xAE\xDFe\xA5" 
a.force_encoding('BINARY').encode('ASCII', :invalid => :replace, :undef => :replace, :replace => 'oo') 

這將啓動強制字符串的二進制編碼(你總是要開始一個字符串,其中字節是有效的其編碼。二進制總是有效的,因爲它可以包含任意字節)。然後它將其轉換爲ASCII。通常這會產生一個錯誤,因爲有些字符不知道該怎麼處理,但是我們通過的額外選項告訴它用字符'oo'替換無效/未定義的序列,所以您想要替換字符'oo'

相關問題