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!!
on 2010-10-26 02:43
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
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!
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
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!!
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
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!!
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
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!!
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
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
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
Log in with Google account | Log in with Yahoo account
No account? Register here.