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

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: "é"

求助?

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之间加入了“-”,这将破坏对空字符的引用,因此会导致范围出错。

哦,亲爱的上帝...请原谅我 :) 谢谢! - Ivan
是的,我们都曾经因为最简单的拼写错误而遭受过繁琐的调试困扰! - bobince
2
空格怎么办?它没有保留空格。 - Mr_Nizzle


2

片段已经消失了 - Dorian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接