Removendo acentos / diacríticos de corda, preservando outros caracteres especiais (mb_chars.normalize experimentado e iconv)

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

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?

Foi útil?

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

Não é tão limpo como Iconv, mas faz o que eu acho que você quer:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top