Codificación WE8MSWIN1252


#1

Buenas, tengo una base de datos oracle que tiene la codificación de
caracteres WE8MSWIN1252

Tengo el típico problema de las tildes y los caracteres latinos, que me
lo
mete como caracteres raros al insertarlo con active scaffold.

Si pongo:

after_filter :set_charset

def set_charset
content_type = @headers[“Content-Type”] || ‘text/html’
if /^text//.match(content_type)
@headers[“Content-Type”] = “#{content_type}; charset=utf8”
end
end

me inserta en bbdd caracteres extraños. Y si meto directamente en la
bbdd
el dato, me lo saca mal en el html generado.

¿Cómo se solucionan estas cosas, por dios?


#2

Hola
No conozco Oracle pero reconozco MSWIN1252 eso es lo mismo que el juego
de
caracteres Latin1 o iso-8859-1. Fijate en el manual del conector si no
hace
falta forzar el juego de caracteres en la conexión.

Ojo con el código que pegaste, donde dice utf8 debería ser utf-8, pero
con
la definición de la base de datos debería funcionar con iso-8859-1

Tienes que tener configurado el mismo juego de caracteres en la DB y en
HTML

Saludos
Hernán


#3

Buenas, finalmente lo solucioné así:

before_filter :convert_hash
after_filter :set_charset

ICONV = Iconv.new(‘ISO-8859-1’, ‘UTF-8’)

def set_charset
content_type = headers[“Content-Type”] || ‘text/html’
if /^text//.match(content_type)
headers[“Content-Type”] = “#{content_type}; charset=iso-8859-1”
end
end

def convert_hash
if request.xhr?
codificar(params) # si es una llamada ajax, llamo al método
codificar con los params
end
end

def codificar(hash)
hash.each_key do |a|
hash[a] = ICONV.iconv(hash[a]) if hash[a].is_a?String # si es
cadena, le aplico el ICONV
codificar hash[a] if hash[a].is_a?Hash # si es un hash, llamo a
esta
misma función
end
end

Así me aseguro de que todo con las cabeceras text venga en latin1 y si
la
llamada es ajax, hago la conversión de utf8 a latin1.

Muchas gracias por vuestra ayuda


#4

Hola

Buenas, tengo una base de datos oracle que tiene la codificación de
caracteres WE8MSWIN1252

Tengo el típico problema de las tildes y los caracteres latinos, que
me lo mete como caracteres raros al insertarlo con active scaffold.
Active Scaffold utiliza ajax para el envío de los datos… cuando envías
con ajax mediante la librería prototype siempre se envía la
información en utf-8 independientemente del charset en el que esté tu página. Esto
es así porque el método serialize de prototype hace uso de una
función javascript estándar que convierte siempre a utf8.

Si tu backend no es utf-8, en cada llamada ajax deberías hacer una
conversión de lo que te llegue a tu encoding (eso lo haces con
Iconv.conv). Si además usas el fallback de que si no hay javascript
habilitado use directamente formularios de toda la vida sin ajax, debes
tenerlo en cuenta porque si no en esos casos te va a intentar convertir
algo que ya va en tu encoding. Para eso no tienes más que condicionar la
conversión del utf8 a tu encoding si lo que recibes es xhr?

Con las cabeceras http en su sitio, el encoding especificado en el
database.yml siendo el correcto, tu tag de apertura de html en tus
layouts indicando el charset adecuado, el fuente de los ficheros en sí
mismo también codificado según lo que necesites y teniendo en cuenta que
las llamadas ajax de prototype te envían siempre utf-8, debería
funcionar el encoding correctamente.

saludos,

javier ramirez