Forum: Rails-ES Eliminar acentos

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
De20b7427a7300175a8149a48a29c3da?d=identicon&s=25 Lourdes (Guest)
on 2007-05-03 16:58
Hola, buenas tardes.

Sabe alguien si hay alguna funcion para eliminar acentos?, tengo un
fichero que importo a mi aplicación y me dá errores cuando hay acentos.


Saludos y gracias
12b49e0819d5eb21c685403e9fc7f93a?d=identicon&s=25 César Duque (Guest)
on 2007-05-03 17:05
(Received via mailing list)
> Sabe alguien si hay alguna funcion para eliminar
> acentos?, tengo un fichero que importo a mi
> aplicación y me dá errores cuando hay acentos.

   ###########
  ###############        __-----__          ##
##################    ###          \       ####
################## #### #            \     # ##
 ####################            \~~\  \   ,##",
  #################       /~~\    \## \  \"     :
    ###############       \    \   \##" /       :
              #######       \### \    /         :
              #############  \###/             :
               ########                       :
                ######   __                  :
                 ####   /\                  /
      ############ ###    \_______________/|
    ##################     \ __         / /
  ####################\__    \  \---\,/ /
  ###################    \     \_____/ /
   #################       \_________/
    ###############
      ###########

MICKEY MOUSE SAYS: UNICODE IS YOUR FRIEND

--
Saludos
Cbe00e00b581ec606014d757c860116f?d=identicon&s=25 Fernando Castillo (Guest)
on 2007-05-03 17:09
(Received via mailing list)
*                   ',
                .-`-,\__
                  ."`   `,
                .'_.  ._  `;.
            __ / `    _ `  `.\ _.--.
           /--,| 0)   0)     )`_.--,)
          |    ;.-----.__ _-');,   /
           '--./       | `.`\ / `"`
        ___..,/;       ;  |--/--._
       `_.---'| \     /  /`;'-._  '.
      .'   .--'\ '---'  / /|`-. '.
         .'     ;-----;` / |
               /``-...' /.:;
              |        |'`` \
              |        / .::.|
             / \      /     `\
            /   '----'   .:::.\*


Cesar la verdad es que me has quitado las palabras de la boca.
8c01355770b98df67a28e5306c5b6502?d=identicon&s=25 Jaime Mora Ramones (moctan)
on 2007-05-03 17:13
Lourdes wrote:
> Sabe alguien si hay alguna funcion para eliminar acentos?, tengo un
> fichero que importo a mi aplicación y me dá errores cuando hay acentos.
>

Cuál es el mensaje de error ?. Puedes postear el fragmento de código ?

Saludos.
---
Jaime Mora Ramones
De20b7427a7300175a8149a48a29c3da?d=identicon&s=25 Lourdes (Guest)
on 2007-05-03 17:19
El problema es de SQL, cuando intento grabar el registro que acabo de
leer de un fichero de texto que está en mi pc.

Si quito el acento me funciona bien.

Este es el error

DBI::DatabaseError: Execute
    OLE error code:80040E14 in Microsoft OLE DB Provider for SQL Server
      Comilla no cerrada antes de la cadena de caracteres '9104900, 1)'.
    HRESULT error code:0x80020009
      Ocurrió una excepción.: INSERT INTO materiales ([descripcion],
[referencia_interna], [sap], [planificador]) VALUES('Rep.Bomba 1"Aro
membrana PRV (fundición)', NULL, '9104900', 1)


Saludos
0e6c0ba9935b52866fd5c54dd886cf2e?d=identicon&s=25 Jaime Iniesta (Guest)
on 2007-05-03 17:24
(Received via mailing list)
Hola Lourdes

El día 3/05/07, Lourdes <ruby-forum-incoming@andreas-s.net> escribió:

> Sabe alguien si hay alguna funcion para eliminar acentos?, tengo un
> fichero que importo a mi aplicación y me dá errores cuando hay acentos.
>

No me suena de ninguna función para hacerlo directamente pero siempre te
puedes hacer tú una "a pata", modificando la cadena con gsub. Un ejemplo
cutre y rápido:

######################
def quita_acentos( cadena )

  cadena = cadena.gsub("á", "a")
  cadena = cadena.gsub("é", "e")
  cadena = cadena.gsub("í", "i")
  cadena = cadena.gsub("ó", "o")
  cadena = cadena.gsub("ú", "u")

end

puts quita_acentos("Yo, para ser feliz, quiero un camión. áéíóú 
ÁÉÍÓÚ")

#######################

Esto se puede hacer mejor con expresiones regulares, supongo. También
hay
que tener en cuenta mayúsculas, eñes, diéresis...

Otra solución es emplear la gema HTMLEntities [1] que te permite
sustituir
todos los caracteres internacionales por su correspondiente codificación
HTML.

Suerte!

Jaime

[1] http://htmlentities.rubyforge.org/
0e6c0ba9935b52866fd5c54dd886cf2e?d=identicon&s=25 Jaime Iniesta (Guest)
on 2007-05-03 17:27
(Received via mailing list)
Ah...

El día 3/05/07, Lourdes <ruby-forum-incoming@andreas-s.net> escribió:
>       Comilla no cerrada antes de la cadena de caracteres '9104900, 1)'.
>     HRESULT error code:0x80020009
>       Ocurrió una excepción.: INSERT INTO materiales ([descripcion],
> [referencia_interna], [sap], [planificador]) VALUES('Rep.Bomba 1"Aro
> membrana PRV (fundición)', NULL, '9104900', 1)


Lo que te pasa no es la tilde en la o de fundición sino esas comillas
después de la bomba... se te cierra el SQL... ¿Cómo montas ese SQL?

Saludos
1f2eadfb41362800ebc2cf211b91d0f7?d=identicon&s=25 javier ramirez (Guest)
on 2007-05-03 17:43
(Received via mailing list)
> membrana PRV (fundición)', NULL, '9104900', 1)
mí me da que tu problema no es que haya una tilde, sino el juego de
caracteres que usas. Puede que con las eñes también te de errores, o
peor... que no te los de pero luego se guarden mal y te des cuenta
demasiado tarde. Podría ser que tu aplicación trabaje en UTF-8 y la base
de datos esté configurada para latin-1/iso-8859-1 (siendo un sqlserver
no sería nada raro). En ese caso lo que deberías hacer es convertir tus
strings al encoding adecuado antes y después de ir a la db.

Por otro lado, ten cuidado también con los apóstrofes y llama a
sanitize_sql antes de intentar almacenar cadenas (o en su defecto usa un
gsub("'", "''"), es decir, un apóstrofe por dos) o tendrás potenciales
problemas con nombres que contengan apóstrofes al estilo O'Reilly.

Saludos,

j


--
--------
Estamos de estreno... si necesitas llevar el control de tus gastos
visita http://www.gastosgem.com !!Es gratis!!
De20b7427a7300175a8149a48a29c3da?d=identicon&s=25 Lourdes (Guest)
on 2007-05-03 17:44
No porque si quito el acento, funciona.


Lo que tu me has dicho de gsub, ya lo había probado, pero me dá este
error:


D:/work/formulas_colores/app/controllers/formulas_controller.rb:152:
parse error, unexpected tIDENTIFIER, expecting ')'
  cadena = cadena.gsub("�", "a")
                              ^
D:/work/formulas_colores/app/controllers/formulas_controller.rb:153:
parse error, unexpected tIDENTIFIER, expecting kEND
  cadena = cadena.gsub("�", "e")
                           ^
D:/work/formulas_colores/app/controllers/formulas_controller.rb:153:
parse error, unexpected ')', expecting kEND
D:/work/formulas_colores/app/controllers/formulas_controller.rb:154:
parse error, unexpected tIDENTIFIER, expecting ')'
  cadena = cadena.gsub("�", "i")
                              ^
D:/work/formulas_colores/app/controllers/formulas_controller.rb:155:
parse error, unexpected tIDENTIFIER, expecting kEND
  cadena = cadena.gsub("�", "o")


lo que estoy haciendo es esto:

def material
#   Material.delete_all # borra la tabla
#
    f=File.open("c:/materiales.txt","r")

  f.each do |linea|
    material = Material.new
    c1,c2,plan,sap,descripcion,c6,c7,c8,c8,c8,c9,c10,c11,c12,c13,ref_int
= linea.chomp.split("\t")
    material.planificador = plan
    material.sap = sap.sub(/^0+/, '')
    material.descripcion = descripcion
    material.referencia_interna = ref_int
       material.save
    end
  end

Saludos
45742831d67c80d12cd7b24907b8d760?d=identicon&s=25 Sergio Gil Pérez de la Manga (Guest)
on 2007-05-03 17:45
(Received via mailing list)
On 5/3/07, Jaime Iniesta <jaimeiniesta@gmail.com> wrote:
> cutre y rápido:
> end
>
> puts quita_acentos("Yo, para ser feliz, quiero un camión. áéíóú ÁÉÍÓÚ")
>
> #######################

Igual de cutre pero más corto =:-P

def quita_acentos(cadena)
  cadena.tr('áéíóúñÁÉÍÓÚÑ', 'aeiounAEIOUN')
end

De todas maneras como han dicho por ahí arriba, más vale ir a por el
problema y no a por el síntoma.

--
Sergio Gil Pérez de la Manga
e-mail > sgilperez@gmail.com
blog > http://www.lacoctelera.com/porras
8c01355770b98df67a28e5306c5b6502?d=identicon&s=25 Jaime Mora Ramones (moctan)
on 2007-05-03 18:23
Lourdes wrote:
> No porque si quito el acento, funciona.
>

Prueba con lo siguiente: agrega las siguientes lineas en
config/environment.rb :

$KCODE = 'u'
require 'jcode'

y además en database.yml prueba con :

encoding: utf8

Nos cuentas que pasó.

Saludos.
---
Jaime Mora Ramones
8c01355770b98df67a28e5306c5b6502?d=identicon&s=25 Jaime Mora Ramones (moctan)
on 2007-05-03 18:34
Además en database.yml prueba con :

encoding: unicode

Desafortunadamente no puedo probarlo, ya que no tengo instalado el SQL
Server.

Saludos.
---
Jaime Mora Ramones
0e6c0ba9935b52866fd5c54dd886cf2e?d=identicon&s=25 Jaime Iniesta (Guest)
on 2007-05-03 18:35
(Received via mailing list)
El día 3/05/07, Sergio Gil Pérez de la Manga <sgilperez@gmail.com>
escribió:
>
>
> Igual de cutre pero más corto =:-P
>
> def quita_acentos(cadena)
>   cadena.tr('áéíóúñÁÉÍÓÚÑ', 'aeiounAEIOUN')
> end


Ese Ruby molón! :P

De todas maneras como han dicho por ahí arriba, más vale ir a por el
> problema y no a por el síntoma.


Pues si. Lourdes, si el problema es la codificación de caracteres,
entonces
tendrás que determinar cuáles son ambas (la del fichero y la de la base
de
datos). En Windows se suele emplear ISO-8859-1 o WINDOWS-1252; en
Gnu/Linux
y Mac, UTF-8...

Para convertir de uno a otro busca en los archivos de la lista por
"Iconv".
De20b7427a7300175a8149a48a29c3da?d=identicon&s=25 Lourdes (Guest)
on 2007-05-04 08:25
Vale, muchas gracias a todos.

Si reinstalase en otra ocasión SQL server, que codificación de
caracteres debería ponerle para no tener problemas?

Saludos
0e6c0ba9935b52866fd5c54dd886cf2e?d=identicon&s=25 Jaime Iniesta (Guest)
on 2007-08-21 13:17
(Received via mailing list)
2007/5/3, Sergio Gil Pérez de la Manga <sgilperez@gmail.com>:
> def quita_acentos(cadena)
>   cadena.tr('áéíóúñÁÉÍÓÚÑ', 'aeiounAEIOUN')
> end

¿Por qué no me funciona bien String.tr? Fijaos en estos intentos de
cambiar vocales:

>> "fernández".tr('á','a')
=> "fernaandez"
>> "fernández".tr('áé','ae')
=> "ferneendez"

¿Por qué me devuelve la vocal duplicada?
Ffd012d72e7f61639724878825ed25a3?d=identicon&s=25 Damian Janowski (djanowski)
on 2007-08-21 15:56
(Received via mailing list)
On 8/21/07, Jaime Iniesta <jaimeiniesta@gmail.com> wrote:
> ¿Por qué no me funciona bien String.tr? Fijaos en estos intentos de
> cambiar vocales:

¿Probaste con Iconv?

require 'iconv'

sin_acentos = Iconv.iconv('ascii//translit//ignore', 'utf-8',
con_acentos).to_s
0e6c0ba9935b52866fd5c54dd886cf2e?d=identicon&s=25 Jaime Iniesta (Guest)
on 2007-08-21 16:22
(Received via mailing list)
2007/8/21, Damian Janowski <damian.janowski@gmail.com>:
> On 8/21/07, Jaime Iniesta <jaimeiniesta@gmail.com> wrote:
> sin_acentos = Iconv.iconv('ascii//translit//ignore', 'utf-8', con_acentos).to_s

Funciona!

Aunque es un poco engorroso eso necesitar de iconv... pero bueno, me
soluciona el tema, que es lo importante.
Ffd012d72e7f61639724878825ed25a3?d=identicon&s=25 Damian Janowski (djanowski)
on 2007-08-21 16:32
(Received via mailing list)
On 8/21/07, Jaime Iniesta <jaimeiniesta@gmail.com> wrote:
> 2007/8/21, Damian Janowski <damian.janowski@gmail.com>:
> > On 8/21/07, Jaime Iniesta <jaimeiniesta@gmail.com> wrote:
> > sin_acentos = Iconv.iconv('ascii//translit//ignore', 'utf-8', con_acentos).to_s
>
> Funciona!
>
> Aunque es un poco engorroso eso necesitar de iconv... pero bueno, me
> soluciona el tema, que es lo importante.

Puede que sea un overkill para lo que lo necesitas ahora, pero
tambiénte soluciona la traducción de acentos de cualquier idioma a su
caracter inglés más parecido ;)

A nosotros nos salvó con idiomas como polaco, portugués, sueco...
0e6c0ba9935b52866fd5c54dd886cf2e?d=identicon&s=25 Jaime Iniesta (Guest)
on 2007-08-21 16:34
(Received via mailing list)
2007/8/21, Jaime Iniesta <jaimeiniesta@gmail.com>:
> Funciona!

Bueno, funciona en el irb pero después en mi app rails no va bien...
me quedo con algo
así:
def quita_acentos( cadena )

  cadena = cadena.gsub("á", "a")
  cadena = cadena.gsub("é", "e")
  cadena = cadena.gsub("í", "i")
  cadena = cadena.gsub ("ó", "o")
  cadena = cadena.gsub("ú", "u")

end
7223c62b7310e164eb79c740188abbda?d=identicon&s=25 Xavier Noria (fxn)
on 2007-08-21 16:44
(Received via mailing list)
On Aug 21, 2007, at 4:33 PM, Jaime Iniesta wrote:

>   cadena = cadena.gsub("í", "i")
>   cadena = cadena.gsub ("ó", "o")
>   cadena = cadena.gsub("ú", "u")
>
> end

La solucion con iconv es va muy bien, en particular IGNORE te da la
tranquilidad de que como mucho puede pasar que algo no se entienda,
pero que el resultado es ASCII seguro.

Tiene un gotcha que es que no todos los iconv tienen la misma tabla
de conversion, y a veces los caracteres acentuados desaparecen. Por
ello suelo tirar de esta secuencia que hice un dia andando con
paciencia por la tabla Unicode del Mac (asume que el fuente y str
estan un UTF-8 y que $KCODE esta OK):

   def self.normalize(str)
     return '' if str.nil?
     n = str.chars.downcase.strip.to_s
     n.gsub!(/[àáâãäåāă]/,    'a')
     n.gsub!(/æ/,            'ae')
     n.gsub!(/[ďđ]/,          'd')
     n.gsub!(/[çćčĉċ]/,       'c')
     n.gsub!(/[èéêëēęěĕė]/,   'e')
     n.gsub!(/Æ’/,             'f')
     n.gsub!(/[ĝğġģ]/,        'g')
     n.gsub!(/[ĥħ]/,          'h')
     n.gsub!(/[ììíîïīĩĭ]/,    'i')
     n.gsub!(/[įıijĵ]/,        'j')
     n.gsub!(/[ķĸ]/,          'k')
     n.gsub!(/[łľĺļŀ]/,       'l')
     n.gsub!(/[ñńňņʼnŋ]/,      'n')
     n.gsub!(/[òóôõöøōőŏŏ]/,  'o')
     n.gsub!(/Å“/,            'oe')
     n.gsub!(/Ä…/,             'q')
     n.gsub!(/[ŕřŗ]/,         'r')
     n.gsub!(/[śšşŝș]/,       's')
     n.gsub!(/[ťţŧț]/,        't')
     n.gsub!(/[ùúûüūůűŭũų]/,  'u')
     n.gsub!(/ŵ/,             'w')
     n.gsub!(/[ýÿŷ]/,         'y')
     n.gsub!(/[žżź]/,         'z')
     n.gsub!(/\s+/,           ' ')
     n.tr!('^ a-z0-9_/\\-',    '')
     n
   end
51b840b74eacc1c32e31bfe412d542af?d=identicon&s=25 Sebastian Delmont (sdelmont)
on 2007-08-21 16:47
(Received via mailing list)
el problema con el .tr original es muy posible que tenga que ver con
los caracteres unicode...

se que "jcode" (la libreria de unicode para ruby) redefine varias
funciones para que sean compatibles con caracteres multibyte
(utf-8)... entre estas esta gsub, pero no se si tr. El rdoc menciona
la funcion, pero el comportamiento que describes me hace pensar que
por alli viene el problema.
Ffd012d72e7f61639724878825ed25a3?d=identicon&s=25 Damian Janowski (djanowski)
on 2007-08-21 17:03
(Received via mailing list)
On 8/21/07, Jaime Iniesta <jaimeiniesta@gmail.com> wrote:
> 2007/8/21, Jaime Iniesta <jaimeiniesta@gmail.com>:
> > Funciona!
>
> Bueno, funciona en el irb pero después en mi app rails no va bien...
> me quedo con algo así:

Si en irb te funciona y en Rails no, probablemente tenga que ver con
el encoding de tu consola y archivos.

Por ejemplo, podrías probar si te anda mediante ./script/console (que
no es más que irb + Rails) a ver si es alguna configuración de Rails
lo que lo hace petar.

Si anda en ./script/console, entonces probablemente el encoding de tus
archivos no sea UTF-8, o lo que lees del fichero de texto, o lo que te
envían por la web...
This topic is locked and can not be replied to.