Supprimer les accents / signes diacritiques de la chaîne tout en préservant les autres caractères spéciaux (essayé mb_chars.normalize et iconv)

Il y a une très question similaire déjà. L'une des solutions utilise un code comme celui-ci:

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

Qui fonctionne à merveille, jusqu'à ce qu'il supprime également des espaces, des points, des tirets, et qui sait quoi d'autre.

Je ne suis pas vraiment sûr de savoir comment le premier code fonctionne, mais pourrait-il en être faite à la bande seulement accents? Ou à tout le moins, être donné une liste de caractères à conserver? Ma connaissance des expressions régulières est petit, mais j'ai essayé (en vain):

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

Je suis sur le point de faire quelque chose comme ceci:

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

Atroce? Oui...

J'ai aussi essayé:

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

Aider s'il vous plaît?

source d'informationauteur Ivan