Eliminar acentos


#1

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


#2

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


#3
  •               ',
              .-`-,\__
                ."`   `,
              .'_.  ._  `;.
          __ / `    _ `  `.\ _.--.
         /--,| 0)   0)     )`_.--,)
        |    ;.-----.__ _-');,   /
         '--./       | `.`\ / `"`
      ___..,/;       ;  |--/--._
     `_.---'| \     /  /`;'-._  '.
    .'   .--'\ '---'  / /|`-. '.
       .'     ;-----;` / |
             /``-...' /.:;
            |        |'`` \
            |        / .::.|
           / \      /     `\
          /   '----'   .:::.\*
    

Cesar la verdad es que me has quitado las palabras de la boca.


#4

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


#5

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 R.


#6

Ah…

El día 3/05/07, Lourdes removed_email_address@domain.invalid 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


#7

Hola Lourdes

El día 3/05/07, Lourdes removed_email_address@domain.invalid 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/


#8

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!!


#9

On 5/3/07, Jaime I. removed_email_address@domain.invalid 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 > removed_email_address@domain.invalid
blog > http://www.lacoctelera.com/porras


#10

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


#11

Además en database.yml prueba con :

encoding: unicode

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

Saludos.

Jaime Mora R.


#12

El día 3/05/07, Sergio Gil Pérez de la Manga removed_email_address@domain.invalid
escribió:

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

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

Ese Ruby molón! :stuck_out_tongue:

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”.


#13

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


#14

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 R.


#15

2007/5/3, Sergio Gil Pérez de la Manga removed_email_address@domain.invalid:

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?


#16

On 8/21/07, Jaime I. removed_email_address@domain.invalid 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


#17

2007/8/21, Damian J. removed_email_address@domain.invalid:

On 8/21/07, Jaime I. removed_email_address@domain.invalid 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.


#18

On 8/21/07, Jaime I. removed_email_address@domain.invalid wrote:

2007/8/21, Damian J. removed_email_address@domain.invalid:

On 8/21/07, Jaime I. removed_email_address@domain.invalid 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 :wink:

A nosotros nos salvó con idiomas como polaco, portugués, sueco…


#19

On Aug 21, 2007, at 4:33 PM, Jaime I. 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


#20

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.