RubyOnRails y UTF8

Usualmente los que desarrollamos aplicaciones web en idiomas que no son el inglés, tenemos inconvenientes en cuanto al encoding de los datos.

Hoy en día lo recomendado es usar UTF8 (8-bit Unicode Transformation Format) para la codificación de los datos.

El soporte de UTF8 en Rails (de hecho en Ruby en general) no es de los mejores :-(
Las pŕacticas comunes para tratar con UTF-8 en aplicaciones Rails son:

  • Especificar en el <head> de las páginas de nuestra aplicación web que estamos usando UTF-8:
    HTML:
    1. <meta http-equiv="Content-type" content="text/html; charset=utf-8" />

    Adicional a esto es bueno indicarle al navegador vía un HTTP Header, que se está usando UTF8, esto se puede hacer creando un after_filter en el app/application.rb de esta forma:

    RUBY:
    1. after_filter :set_content_type
    2.  
    3. def set_content_type
    4.   @headers["Content-Type"] ||= "text/html; charset=utf-8"
    5. end

  • Fijar en el config/environment.rb el valor de $KCODE a 'u':
    RUBY:
    1. $KCODE = 'u'

    Al hacer esto se le indica a Ruby que los fuentes de los códigos están codificados en UTF-8 (es importante usar un IDE o editor que soporte UTF8). Algunas librerías (CGI y parte de Rails) inspeccionan el valor de $KCODE para saber si necesitan procesar los strings como UTF8.
    Al parecer estas asignaciones a $KCODE son equivalentes:

    RUBY:
    1. $KCODE = 'u'
    2. $KCODE = 'utf8'
    3. $KCODE = 'UTF8'

  • Agregar en el config/environment.rb una línea para requerir la librería jcode:
    RUBY:
    1. require 'jcode'

    Esta librería ofrece soporte básico para la codificación UTF-8.

  • Si la base de datos que usamos es MySQL, esta debe estar en UTF-8:
    MySQL:
    1. CREATE DATABASE demo CHARACTER SET utf8 COLLATE utf8_general_ci;

    En mi experiencia el collation utf8_general_ci ha sido suficiente, sin embargo si los datos de la aplicación están estrictamente en español se puede usar el collation utf8_spanish_ci.
    Para más información consultar el manual de referencia de MySQL.
    Hay que indicar el tipo de encoding de la conexión a la base de datos, la forma más sencilla es modificando el archivo config/database.yml:

    RUBY:
    1. production
    2.   adapter: mysql
    3.   username: root
    4.   password:
    5.   host: localhost
    6.   encoding: utf8

    Otra alternativa, es fijar programaticamente la conexión en UTF8, como lo hace el plugin LocalizationSimplified, con un before_filter:

    RUBY:
    1. before_filter :configure_charsets
    2.  
    3. def configure_charsets
    4.   suppress(ActiveRecord::StatementInvalid) do
    5.     ActiveRecord::Base.connection.execute 'SET NAMES UTF8'
    6.   end
    7. end

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.

Y para terminar, si tienes una aplicación Rails que no está UTF8, Graeme Mathieson escribió unos migrations que te ayudan a Migrar tu Aplicación Rails a Unicode.


4 Respuestas a “RubyOnRails y UTF8”

  1. 1 Gubatron

    Ruby sucks, Python pwnz.

  2. 2 Mi Nombre Es

    python eats rubys for breakfast

  3. 3 Carlos

    Hola Edgar, me sorprende ver la reciente entrada en tu blog en el que tratas de forma "un tanto similar", por no decir idéntica, el tema de UTF-8 al del mio incluyendo algunas referencias como la de "Graeme Mathieson".

    Echale un poco de imaginación la proxima vez.

    Gracias

    3eq11.wordpress.com

  4. 4 Edgar González

    Carlos para ser sinceros estaba escribiendo el post cuando lei tu comentario en la lista de RoR-es.

    Realmente no tengo ningún interés en "plagiarte" un post. Sin embargo, efectivamente tu post fue publicado antes que el mio, y acabo de agregar un link de referencia

Añade un Comentario





RSS feeds

Suscríbete a nuestros RSS Feeds