Rimozione accenti / diacritics da stringa preservando altri caratteri speciali (mb_chars.normalize provato e iconv)

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

Domanda

C'è una domanda simile molto già . Una delle soluzioni utilizza il codice come questo:

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

Il che fa miracoli, fino a quando si nota che rimuove anche spazi, punti, trattini, e chissà che altro.

Non sono davvero sicuro di come funziona il primo codice, ma potrebbe essere fatto per mettere a nudo solo accenti? O per lo meno essere dato un elenco di caratteri per preservare? La mia conoscenza di espressioni regolari è piccolo, ma ho cercato (inutilmente):

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

che sto per fare qualcosa di simile:

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

Atroce? Sì ...

Ho anche provato:

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

Aiuto per favore?

È stato utile?

Soluzione

  

rimuove anche spazi, punti, trattini, e chissà che altro.

Non dovrebbe.

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

È un errore di digitazione, ci dovrebbe essere una barra rovesciata prima del x00, per riferirsi al carattere NUL.

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

Hai messo il ‘-’. Tra il ‘\’ e la ‘x’, che romperà il riferimento al carattere nullo, e quindi rompere l'intervallo

Altri suggerimenti

Non è così pulito come Iconv, ma fa quello che penso che vuoi:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top