RubyOnRails y UTF8
Publicado por Edgar González 1 Noviembre 2006 en Rails, Ruby, i18n / l10n. english • españolUsualmente 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:-
<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_filteren elapp/application.rbde esta forma:RUBY:-
after_filter :set_content_type
-
-
def set_content_type
-
@headers["Content-Type"] ||= "text/html; charset=utf-8"
-
end
-
- Fijar en el
config/environment.rbel valor de$KCODEa'u':RUBY:-
$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
$KCODEpara saber si necesitan procesar los strings como UTF8.
Al parecer estas asignaciones a$KCODEson equivalentes:RUBY:-
$KCODE = 'u'
-
$KCODE = 'utf8'
-
$KCODE = 'UTF8'
-
- Agregar en el
config/environment.rbuna línea para requerir la libreríajcode:RUBY:-
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:
-
CREATE DATABASE demo CHARACTER SET utf8 COLLATE utf8_general_ci;
En mi experiencia el collation
utf8_general_ciha sido suficiente, sin embargo si los datos de la aplicación están estrictamente en español se puede usar el collationutf8_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 archivoconfig/database.yml:RUBY:-
production
-
adapter: mysql
-
username: root
-
password:
-
host: localhost
-
encoding: utf8
Otra alternativa, es fijar programaticamente la conexión en UTF8, como lo hace el plugin LocalizationSimplified, con un
before_filter:RUBY:-
before_filter :configure_charsets
-
-
def configure_charsets
-
suppress(ActiveRecord::StatementInvalid) do
-
ActiveRecord::Base.connection.execute 'SET NAMES UTF8'
-
end
-
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.
Ruby sucks, Python pwnz.
python eats rubys for breakfast
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
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