UTF8 en RoR

1 11 2006

UTF-8 (8-bit Unicode Transformation Format) es una codificación de caracteres de longitud variable para Unicode. Una de sus ventajas es que puede codificar cualquier caracter.

Para poder emplear UTF-8 debemos trabajar con esta codificación desde el principio hasta el final del proyecto y en todas y cada una de sus partes. No es suficiente emplearla en la edición de código, si el proyecto accede a base de datos, ésta deberá estar configurada para su uso.

En este caso se trata de un proyecto RoR con conexión a MySQL.

Edición de código:

El primer paso será disponer de un editor de texto o IDE que permita el uso de UTF-8 y emplear esa configuración a lo largo de todo el proyecto (ficheros .rb, .rhtml, etc).

Adaptar el navegador:

Para poder visualizar el contenido correctamente en el navegador deberemos indicarle que emplee la codificación correcta. Esto se consigue añadiendo la siguiente línea en la cabecera html (normalmente definida en “application.rhtml”):

head

Configurar las variables de sistema de MySQL:

– Configuración manual

Localizar el fichero de configuración de MySQL. En OSX y linux se encuentra en /etc/my.cnf

A continuación de la línea [mysqld] añadiremos lo siguiente:

character-set-server=utf8
collation-server=utf8_spanish_ci
default-character-set=utf8
default-collation=utf8_spanish_ci

Nota: Para modificar el contenido de este fichero hay que acceder en modo superusuario.

Configurar variables en modo gráfico

Otra alternativa para modificar las variables consiste en emplear algún GUI, en el caso de MySQL Administrator, dentro de la opción Options > Advanced > Localization están disponibles las variables donde se define el charset (Las modificaciones quedan reflejadas en el fichero “my.cnf”).

Re-arrancar mysql

Para verificar que la configuración ha sido aceptada se puede recurrir a la interfaz de línea de comandos de MySQL o de alguna GUI tipo CocoaMysql. Si el proceso ha sido correcto, todas las variables relacionadas con “charset” deberían contener “utf8”.

Esta misma verificación la podemos realizar empleando la línea de comandos MySQL:

$ /usr/local/mysql/bin/mysql -u nombre_usuario -p nombre_bbdd
mysql> SHOW VARIABLES;

variables_linea_de_comandos

Nota[Linea de comandos MySQL]: En lugar de emplear “SHOW VARIABLES;” utilizar “\s” (muestra menos información).

Configurar Rails:

Para configurar Rails, es necesario realizar un par de tareas:

  • Añadir la siguiente línea al fichero config/environment.rb:
    $KCODE = ‘u’
  • Para establecer el tipo de codificación a emplear por el cliente (ActiveRecord) al conectarse a MySQL, en cada una de las secciones (development, test, production) del fichero config/database.yml añadiremos:
    encoding: utf8

    Existen otras dos posibilidad para conseguir esto mismo:

    Crear un before_filter (Opción propuesta por Edgar Gonzalez desde el foro Ror-es@lists.simplelogica.net):

    suppress(ActiveRecord::StatementInvalid) do
       ActiveRecord::Base.connection.execute ‘SET NAMES UTF8’
    end

    O añadir la siguiente línea al fichero de configuración de MySQL /etc/my.cnf.
    init_connect=’SET NAMES utf8′
    Esta última forma no parece la más “limpia” de hacerlo, ya que condiciona la codificación de todas las conexiones, sean de Rails o de otras aplicaciones.

UTF-8 en las migraciones:

Si ya disponemos de la estructura de base de datos y queremos adaptarla a UTF-8, deberíamos emplear las migraciones añadiendo el siguiente código.

Para definir el charset de una bbdd podemos añadir en la primera migración como primera orden la siguiente:

execute “ALTER DATABSE ombre_bbdd` SET CHARACTER SET utf8;”

Si solo pretendemos modificar el charset de una tabla:

execute “ALTER TABLE `nombre_bbdd`.`nombre_tabla` CHARACTER SET utf8”

Si no solo queremos adaptar la estructura sino todos los datos contenidos en la misma, existe un artículo escrito por Graeme Mathieson en su blog “woss.name” (ver fuentes) que describe un método rápido y sencillo.

fuente: es.wikipedia
fuente: woss.name

Add to Technorati Favorites

Anuncios

Acciones

Information

5 responses

1 11 2006
RubyOnRails y UTF8 ›› La Cara Oscura del Desarrollo de Software

[…] Un post muy similar y coincidencialmente publicado hoy mismo respecto al tema puede ser visto en UTF8 en RoR, donde Carlos presenta otro enfoque para la configuración de MySQL. […]

27 11 2007
Daniel

I couldn’t understand some parts of this article nnial 2007 – salvatore iaconesi – del.icio.us poetry, but I guess I just need to check some more resources regarding this, because it sounds interesting.

18 12 2007
Eduardo

Hace un tiempo tuve un problema al intentar meter caracteres utf-8 en una tabla de oracle configurado para utilizar utf-8 cuyos datos estaban defininidos como:

nombrecampo VARCHAR2 (1 BYTE),

Al intentar meter caracteres de la normal iso 8859 cuyo valor en utf-8 requeria una codificacion mayor de 1 byte (ñ,á,à…), oracle lanzaba error.

Entre las distintintas soluciones posibles, lo más opropiada fue cambiar la deficinion del campo de la tabla a :

nombrecampo VARCHAR2 (1 CHAR),

Espero que sirva de ayuda y que evite algun quebradero de cabeza como el que he tenido estos días.

Un saludo.

para solucionar

15 05 2009
Jhony Gonzalez

Hola hace dias estoy cargando un archivo csv a una aplicación rails y todo me funciona bien, pero por ejemplo cuando se cargan datos que tienen tildes este se guarda con por ejemplo corazón y si creara un registro desde la interfaz de la aplicación el registro quedaria con caracteres raros en la bd

el problema consiste en que la aplicación esta diseñada para que lo que lea desde la bd lo convierta a utf8 pero cuando cargo con csv este me lo muestra con caracteres raros. que puedo hacer

18 05 2009
3eq11

Me gustaría conocer algún detalle más antes de contestarte.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




A %d blogueros les gusta esto: