10

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

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

这很神奇,直到你注意到它还删除了空格、点、破折号,谁知道还有什么。

我不太确定第一个代码是如何工作的,但可以让它去除重音吗?或者至少得到一个要保存的字符列表?我对正则表达式的了解很少,但我尝试过(无济于事):

/[^\-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: "é"

请帮忙?

4

3 回答 3

12

它还删除了空格、点、破折号,还有谁知道还有什么。

它不应该。

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

您打错了,x00 之前应该有一个反斜杠,以引用 NUL 字符。

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

您已将“-”放在“\”和“x”之间,这将破坏对空字符的引用,从而破坏范围。

于 2009-02-07T01:00:08.910 回答
4

我会使用这种transliterate方法。请参阅http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-transliterate

于 2013-07-14T11:27:02.073 回答
2

它不像 Iconv 那样整洁,但可以满足我的要求:

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

于 2009-02-07T01:04:25.233 回答