ruby on rails - rails - Eliminando acentos/diacríticos de la cadena mientras conserva otros caracteres especiales(intenté mb_chars.normalize e iconv)
ruby string upcase (3)
Ya hay una pregunta muy similar . Una de las soluciones usa código como este:
string.mb_chars.normalize(:kd).gsub(/[^x00-/x7F]/n, '''').to_s
Lo cual funciona de maravilla, hasta que notes que también elimina espacios, puntos, guiones y quién sabe qué más.
No estoy muy seguro de cómo funciona el primer código, pero ¿podría hacerse para quitar solo los acentos? ¿O al menos recibir una lista de caracteres para preservar? Mi conocimiento de las expresiones regulares es pequeño, pero lo intenté (en vano):
/[^/-x00-/x7F]/n # So it would leave the dash alone
Estoy a punto de hacer algo como esto:
string.mb_chars.normalize(:kd).gsub(''-'', ''__DASH__'').gsub
(/[^x00-/x7F]/n, '''').gsub(''__DASH__'', ''-'').to_s
¿Atroz? Sí...
También lo intenté:
iconv = Iconv.new(''UTF-8'', ''US-ASCII//TRANSLIT'') # Also tried ISO-8859-1
iconv.iconv ''Café'' # Throws an error: Iconv::IllegalSequence: "é"
¿Ayuda por favor?
también elimina espacios, puntos, guiones y quién sabe qué más.
No debería.
string.mb_chars.normalize(:kd).gsub(/[^x00-/x7F]/n, '''').to_s
Ha escrito mal, debe haber una barra invertida antes del x00, para referirse al carácter NUL.
/[^/-x00-/x7F]/n # So it would leave the dash alone
Has puesto el ''-'' entre la ''/' y la ''x'', que romperá la referencia al carácter nulo, y así romperá el rango.
No es tan limpio como Iconv, pero hace lo que creo que quieres:
Usaría el método de transliterate
. Ver http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-transliterate