Problema con acentos y caracteres especiales

Hola a todos!!

Este es mi código (esta en haml):

- form_for @informacion do |f|
  = f.error_messages
  %p
    = f.label :cabecera
    %br/
    = f.text_field(:cabecera, :size => 30)
  %p
    = f.label :texto
    %br/
    = f.text_area(:texto, :cols => 120)
  %p
    = f.submit(@informacion.new_record? ? "Agregar Información" :

“Actualizar Información”, :class => ‘botones’)
= link_to(“Cancelar”, informaciones_path, :class => ‘cancelar’)

El problema que tengo es que cuando los datos introducidos en la base de
datos contienen acentos o eñes o cualquier otro caracter especial al
intentar editar los datos me un error de codificación: “incompatible
character encodings: ASCII-8BIT and UTF-8”.

Este error me aparecía siempre pero en el resto de vistas (index, new y
show) lo he solucionado con el método force_encoding(‘utf-8’) pero en el
caso del edit no consigo hacerlo funcionar.

Trabajo con una base de datos MySql, he comprobado que todas las
configuraciones pertinentes estén configuradas a UTF-8 y demás y la
verdad es que no tengo ni idea de donde puede estar el problema ni de
como solucionarlo por lo que agradecería cualquier ayuda o sugerencia.

Espero haberme explicado bien, si necesitáis cualquier otra información,
por favor, hacermelo saber.

Un saludo y gracias por adelantado!!

Gary Marquez wrote in post #957073:

El problema que tengo es que cuando los datos introducidos en la base de
datos contienen acentos o eñes o cualquier otro caracter especial al
intentar editar los datos me un error de codificación: “incompatible
character encodings: ASCII-8BIT and UTF-8”.

Trabajo con una base de datos MySql, he comprobado que todas las
configuraciones pertinentes estén configuradas a UTF-8 y demás.

Obviamente, no has comprobado lo suficiente que todas las
configuraciones estén configuradas a UTF-8…

En MySQL, el encoding está a nivel de BBDD, a nivel de tabla y a nivel
de campo; y cuando cambias el encoding de un nivel superior, no te
cambia los encodings de los niveles inferiores (sólo le sirve para
tomarlo como valor por defecto para los nuevos “hijos” que se creen).

Si usas el Sequel Pro (gratuito) para revisar tu BBDD, en la pestaña
“Table info” te sale, arriba, el type, encoding y collation de la
tabla… pero ese no es fiable, sólo indica lo que se aplicará para los
nuevos campos que se creen. Más abajo, verás el “create syntax”, y ahí
sí verás el verdadero encoding de cada campo… mira bien y verás como
no todos son UTF-8.

Y ya que revisas, como no sólo de encodings vive el mysql, asegúrate
además que uses la misma collation para todos; utf8_general_ci puede
servir (si ya lo estás usando no vale la pena cambiarlo), pero lo ideal
es utf8_spanish_ci.

s2

Muchas gracias por la información Fernando.

Voy a abusar un poco de tu amabilidad. Yo utilizo Linux, no conoceras
por casualidad algún programa similar al Sequel Pro para este SO??

Tengo las clasicas herramientas de MySql como MySql Administrator y
MySql Query Browser pero no se donde consultar la codificación por campo
y tabla como tu me indicas…

Gracias de nuevo!

Hola de nuevo Fernando!!

Perdona que te siga molestando pero como ves no tengo mucha idea de este
tema y voy un poco perdido…

He realizado la consulta que me comentabas y los resultados obtenidos,
por ejemplo en esta tabla, son los siguientes:

CREATE TABLE noticias (
id int(11) NOT NULL AUTO_INCREMENT,
titulo varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
texto text COLLATE utf8_unicode_ci,
created_at datetime DEFAULT NULL,
updated_at datetime DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8
COLLATE=utf8_unicode_ci

He intentado modificar el COLLATE con las siguientes sentencias SQL:

ALTER DATABASE COLLATE utf8_spanish_ci

ALTER DATABASE acen_development COLLATE utf8_spanish_ci

ALTER DATABASE acen_development CHARACTER SET utf8 COLLATE
utf8_spanish_ci

He probado con las tres sentencias y no me modifica la codificación en
ningún caso, ¿que estoy haciendo mal?

Gracias de nuevo por tu ayuda!!

En realidad, no necesitas ningún programa en particular; si no tienes el
Sequel, puedes consultarlo directamente con una query:

SHOW CREATE TABLE visitas_tmp;

Te devolverá algo así:

CREATE TABLE visitas_tmp (
id int(11) default NULL,
user_agent varchar(255) default NULL,
permalink varchar(255) default NULL,
created_at datetime default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

(el COLLATE no lo reporta si es utf8_general_ci)

Y si los campos no coinciden con lo declarado para la tabla, nos dará la
información detallada a nivel del campo:

CREATE TABLE likerts (
id int(11) NOT NULL auto_increment,
producto varchar(255) character set utf8 default NULL,
elemento_a_valorar varchar(255) character set utf8 default NULL,
rotulo varchar(255) character set utf8 default NULL,
rotulo_corto varchar(25) character set utf8 default NULL,
nota int(11) default NULL,
descripcion varchar(255) character set utf8 default NULL,
created_at datetime default NULL,
updated_at datetime default NULL,
PRIMARY KEY (id),
KEY index_likerts_on_producto_and_elemento_a_valorar_and_nota
(producto,elemento_a_valorar,nota)
) ENGINE=InnoDB AUTO_INCREMENT=561 DEFAULT CHARSET=utf8
COLLATE=utf8_spanish_ci;

(¿ves todos esos character set utf8? son campos utf8 pero con collation
utf8_general_ci)

s2

Gary Marquez wrote in post #957300:

He intentado modificar el COLLATE con las siguientes sentencias SQL:

ALTER DATABASE COLLATE utf8_spanish_ci

ALTER DATABASE acen_development COLLATE utf8_spanish_ci

ALTER DATABASE acen_development CHARACTER SET utf8 COLLATE
utf8_spanish_ci

He probado con las tres sentencias y no me modifica la codificación en
ningún caso, ¿que estoy haciendo mal?

Gracias de nuevo por tu ayuda!!

No lo estás haciendo mal, simplemente estás haciendo otra cosa: Cambiar
la codificación de la BBDD (¿recuerdas que en MySQL, el encoding está a
nivel de BBDD, a nivel de tabla y a nivel
de campo?)

Lo que tú quieres hacer es esto:

ALTER TABLE noticias MODIFY titulo VARCHAR(255) CHARACTER SET
utf8 COLLATE utf8_spanish_ci;

ALTER TABLE noticias MODIFY texto TEXT CHARACTER SET utf8
COLLATE utf8_spanish_ci;

S2

Supongo que el servidor es Linux (nada de Windows), y que en el HEAD de
tu plantilla hay una línea parecida a esto:

También en el archivo de configuración database.yml debe aparecer esto:
encoding: utf8
tanto en el apartado de development como en test y production…

Si algo de esto no es así, prueba a cambiarlo; y si esto está todo bien
y sigue fallando, mira en los logs la query que está lanzando y prueba a
lanzarla a mysql desde fuera de la aplicación… así acotarás el
problema, porque ya sabrás si es cuestión de la BBDD o de la aplicación.

ya nos contarás…

s2

De acuerdo. Ya he conseguido cambiar la codificación de mi BBDD, si no
me equivoco, a todos los niveles (BBDD, tablas y columnas). Este es el
resultado en una de las tablas que pongo como ejemplo, pero todas están
iguales:

CREATE TABLE noticias (
id int(11) NOT NULL AUTO_INCREMENT,
titulo varchar(255) COLLATE utf8_spanish_ci DEFAULT NULL,
texto text COLLATE utf8_spanish_ci,
created_at datetime DEFAULT NULL,
updated_at datetime DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8
COLLATE=utf8_spanish_ci

Dicho esto, volvemos a mi problema inicial. Me sigue ocurriendo lo mismo
que al principio, cuando los datos introducidos en la base de
datos contienen acentos o eñes o cualquier otro caracter especial al
intentar editar los datos me un error de codificación: “incompatible
character encodings: ASCII-8BIT and UTF-8”.

Es evidente que lo que tu me has comentado, Fernando, estaba mal pero a
pesar de haberlo corregido no he solucionado el problema.

¿Alguien sabe que podría estar ocurriendo?

Gracias!!

Gracias de nuevo Fernando.

Tanto la cabecera del layout como la configuración del database.yml son
correctos. Eso ya lo había comprobado previamente a esta consulta.

Voy a probar a lanzar la consulta desde fuera de la aplicación y te
cuento.

Un saludo!!

Esa query no puede dar problemas… efectivamente, debe ser la vista (o
el controller). ¿Haces alguna concatenación o comparación de cadenas en
la vista o en el controller? es lo único que se me ocurre…

s2

He lanzado la consulta desde fuera de la aplicación y funciona sin
problemas. La verdad es que la consulta es muy sencilla:

SELECT noticias.* FROM noticias WHERE (noticias.id = 10) LIMIT 1

Y funciona sin problemas. De hecho pienso que el problema no es la
consulta. El error se presenta al renderizar la vista en ActionView:

ActionView::Template::Error (incompatible character encodings: UTF-8 and
ASCII-8BIT):

No se, estoy más perdido que un pulpo en un garaje.

Alguna idea??
Por si sirve de algo diré que estoy utilizando Ruby 1.9.2 y Rail
3.0.0.rc2

Hola de nuevo.

Parece que he encontrado una solución. Tengo que decir, antes que nada,
que no se si será la forma mas ortodoxa de hacerlo y seguro que si
alguien que controle bastante de Rails lo ve quizás le parezca horrible,
pero vaya la cuestión es que funciona y después de leer e investigar
mucho por la red sin encontrar una solución válida, para mi es
suficiente con que funcione, y lo voy a postear por si alguien tiene el
mismo problema que yo y le sirve de solución.

Lo he conseguido recod¡ficando en el controlador ‘edit’, que es el que
me daba problemas, cada columna de la tabla a utf-8 con el método
force_encoding(‘utf-8’). Ahi va el código:

def edit
@noticia = Noticia.find(params[:id])
@noticia.titulo.force_encoding(‘utf-8’) unless @noticia.titulo.nil?
@noticia.texto.force_encoding(‘utf-8’) unless @noticia.texto.nil?
end

Un saludo y gracias de nuevo por tu tiempo y tu interés Fernando.