从字符串中可靠地删除unicode的最佳方法是什么

问题描述:

我有很多字符串,我需要将'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

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

此外,您的用例是用于删除非ASCII字符?除非你正在建立一个URL slug,否则这可能不是一个好主意。如果你构建一个URL slug,有很多gem(比如friendly_id)会为你做这个。

+0

也没有。我只需要拉出物品的名称,并不在乎它们是否注册了商标等。虽然如此,谢谢。 – jcollum

+0

啊,好的。我懂了。在这种情况下,最好不要去除非ASCII字符,只删除不需要的字符。 –

这可能是有点低效率的,因为它建立在它的每一个字符数组,但它会工作(用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