从字符串中删除重音符号/变音符号,同时保留其他特殊字符(尝试过mb_chars.normalize和iconv)

有一个非常类似的问题 。 其中一个解决方案使用如下代码:

string.mb_chars.normalize(:kd).gsub(/[^x00-\x7F]/n, '').to_s 

哪个有奇效,直到你注意到它还会删除空格,圆点,短划线以及谁知道还有什么。

我不是很确定第一个代码是如何工作的,但它是否可以删除重音? 或者至少要给出一个要保留的字符列表? 我对regexp的了解很少,但我尝试过(无济于事):

 /[^\-x00-\x7F]/n # So it would leave the dash alone 

我要做这样的事情:

 string.mb_chars.normalize(:kd).gsub('-', '__DASH__').gsub (/[^x00-\x7F]/n, '').gsub('__DASH__', '-').to_s 

残暴? 是…

我也尝试过:

 iconv = Iconv.new('UTF-8', 'US-ASCII//TRANSLIT') # Also tried ISO-8859-1 iconv.iconv 'Café' # Throws an error: Iconv::IllegalSequence: "é" 

请帮忙?

它还会移除空格,圆点,破折号以及谁知道还有什么。

它不应该。

 string.mb_chars.normalize(:kd).gsub(/[^x00-\x7F]/n, '').to_s 

您输入错误,在x00之前应该有反斜杠,以引用NUL字符。

 /[^\-x00-\x7F]/n # So it would leave the dash alone 

你把’ – ‘放在’\’和’x’之间,这将打破对空字符的引用,从而打破范围。

我会使用transliterate方法。 见http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-transliterate

它不像Iconv那样整洁,但做了我认为你想要的东西:

http://snippets.dzone.com/posts/show/2384