Forum: Rails-ES Problema con acentos y caracteres especiales

Posted by Gary Marquez (garyto)
on 2010-10-26 02:43
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!!
Posted by Fernando Calatayud (fernan2)
on 2010-10-26 18:25
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
Posted by Gary Marquez (garyto)
on 2010-10-26 18:44
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!
Posted by Fernando Calatayud (fernan2)
on 2010-10-26 19:02
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
Posted by Gary Marquez (garyto)
on 2010-10-26 20:56
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!!
Posted by Fernando Calatayud (fernan2)
on 2010-10-26 22:13
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
Posted by Gary Marquez (garyto)
on 2010-10-27 19:38
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!!
Posted by Fernando Calatayud (fernan2)
on 2010-10-27 19:59
Supongo que el servidor es Linux (nada de Windows), y que en el HEAD de 
tu plantilla hay una línea parecida a esto:

<meta content='text/html; charset=utf-8' http-equiv='Content-Type' />

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
Posted by Gary Marquez (garyto)
on 2010-10-27 20:20
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!!
Posted by Gary Marquez (garyto)
on 2010-10-27 21:09
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
Posted by Fernando Calatayud (fernan2)
on 2010-10-27 23:27
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
Posted by Gary Marquez (garyto)
on 2010-10-27 23:31
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.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.