2011-11-18 116 views
1

我有很多字符串,我需要將'TM','(c)'等從字符串中刪除。這些標記是unicode。現在我只想把所有的unicode都拉出來,一旦我得到了這個工作,我會更有選擇性,並且只是取消法律標記。下面的代碼:從字符串中可靠地刪除unicode的最佳方法是什麼

strings = ['Star Wars \u2122 2', 'Empire Strikes Back\u00C2\u00AE The Strikening', 
     "Star Wars\u2122 2", "Empire Strikes Back\u00C2\\u00AE The Strikening"] 

p strings.inspect 

strings.each { |str| 
    sub = str.gsub(/\\(u[(\d)a-fA-F]{4})/, "") 
    p sub 
} 

結果:

["Star Wars \\u2122 2", "Empire Strikes Back\\u00C2\\u00AE The Strikening", "Star Wars\u2122 2", "Empire Strikes Back\u00C2\\u00AE The Strikening"] 
"Star Wars 2" 
"Empire Strikes Back The Strikening" 
"Star Wars\u2122 2" 
"Empire Strikes Back\u00C2 The Strikening" 

Works的單引號,而不是增加一倍。我知道單引號字符串的行爲與雙引號字符串不同。這裏的問題是被饋入這個函數的字符串表現爲雙引號字符串並且破壞了代碼(替代不會發生)。我嘗試在gsub之前添加sub('\\', '\\\\'),但那並未解決問題。

我想我誤解了Ruby中的字符串行爲。如何可靠地從"Star Wars\u2122 2"中刪除unicode符號?我擁有的正則表達式並沒有這樣做。

的Ruby 1.9.3

回答

1

只要做'String with ™ and ®'.delete '™®'

此外,您的用例是用於刪除非ASCII字符?除非你正在建立一個URL slug,否則這可能不是一個好主意。如果你構建一個URL slug,有很多gem(比如friendly_id)會爲你做這個。

+0

也沒有。我只需要拉出物品的名稱,並不在乎它們是否註冊了商標等。雖然如此,謝謝。 – jcollum

+0

啊,好的。我懂了。在這種情況下,最好不要去除非ASCII字符,只刪除不需要的字符。 –

6

這可能是有點低效率的,因爲它建立在它的每一個字符數組,但它會工作(用Ruby 1.9及更高版本):

s = "Empire Strikes Back\u00C2\u00AE The Strikening" 
t = s.chars.select(&:ascii_only?).join # => "Empire Strikes Back The Strikening" 

當你編寫'\u00C2'您並未創建包含unicode的字符串。您正在創建一個包含5個ASCII字符的字符串。當您編寫"\u00C2"時,您正在創建一個包含單個非ASCII Unicode字符的字符串。這是雙引號表示法和單引號表示法之間的區別之一。

+0

嗯,我想我寧願得到正則表達式的工作。我懷疑我可能需要處理éê等。我想從長遠來看,我將不得不有多個gsubs,每個標記我需要拉一個。 – jcollum

+0

感謝您對re:unicode的解釋。這是有道理的。似乎完全旨在絆倒新生,這'兩種類型的字符串'的事情。 – jcollum

相關問題