Removendo acentos / diacríticos de corda, preservando outros caracteres especiais (mb_chars.normalize experimentado e iconv)
-
22-08-2019 - |
Pergunta
Há uma semelhante pergunta já . Um dos o código soluções usos como este:
string.mb_chars.normalize(:kd).gsub(/[^x00-\x7F]/n, '').to_s
O que faz maravilhas, até que você observe também remove espaços, pontos, traços, e quem sabe o que mais.
Eu não sou realmente certo como as primeiras obras de código, mas poderia ser feito para tira somente acentos? Ou, no mínimo, ser dada uma lista de caracteres para preservar? Meu conhecimento de regexps é pequeno, mas eu tentei (sem sucesso):
/[^\-x00-\x7F]/n # So it would leave the dash alone
Eu estou prestes a fazer algo como isto:
string.mb_chars.normalize(:kd).gsub('-', '__DASH__').gsub
(/[^x00-\x7F]/n, '').gsub('__DASH__', '-').to_s
atroz? Sim ...
Eu também tentei:
iconv = Iconv.new('UTF-8', 'US-ASCII//TRANSLIT') # Also tried ISO-8859-1
iconv.iconv 'Café' # Throws an error: Iconv::IllegalSequence: "é"
Ajuda por favor?
Solução
ele também remove espaços, pontos, traços, e quem sabe o que mais.
Ele não deveria.
string.mb_chars.normalize(:kd).gsub(/[^x00-\x7F]/n, '').to_s
Você digitado incorretamente, deve haver uma barra invertida antes do x00, para se referir ao carácter NUL.
/[^\-x00-\x7F]/n # So it would leave the dash alone
Você colocou o ‘-’. Entre o ‘\’ e o ‘x’, que vai quebrar a referência para o caractere nulo, e, assim, quebrar a gama
Outras dicas
Eu uso o método transliterate
. Consulte http://api.rubyonrails.org/classes/ActiveSupport/ método-i-transliterate Inflector.html #
Não é tão limpo como Iconv, mas faz o que eu acho que você quer: