Rimozione accenti / diacritics da stringa preservando altri caratteri speciali (mb_chars.normalize provato e iconv)
-
22-08-2019 - |
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?
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
mi piacerebbe utilizzare il metodo transliterate
. Vedere http://api.rubyonrails.org/classes/ActiveSupport/ Inflector.html # metodo-i-traslitterare
Non è così pulito come Iconv, ma fa quello che penso che vuoi: