Suppression d'accents / diacritiques de chaîne tout en conservant d'autres caractères spéciaux (essayé mb_chars.normalize et iconv)

StackOverflow https://stackoverflow.com/questions/522715

Question

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

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

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

Je ne suis pas sûr de savoir comment fonctionne le premier code, mais pourrait-il être fait dépouiller uniquement accents? Ou donner au moins une liste de caractères pour préserver? Ma connaissance de regexps est petite, 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: "é"

Aide s'il vous plaît?

Était-ce utile?

La solution

  

il supprime également des espaces, des points, des tirets, et qui sait quoi d'autre.

Il ne devrait pas.

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

Vous avez mal saisi, il devrait y avoir une barre oblique inverse avant le x00, pour désigner le caractère NUL.

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

Vous avez mis le « - ». Entre le « \ » et le « x », qui cassera la référence au caractère nul, et donc briser la plage

Autres conseils

Il est pas aussi propre que Iconv, mais fait ce que je pense que vous voulez:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top