Poniendo todo en UTF-8
Leyendo un poco, me encuentro con que en RoR (y pensándolo mejor en cualquier otro framework) es mejor tenerlo todo con la misma configuración para el manejo de caracteres, especialmente si nuestra aplicación no está escrita en inglés.
Estas son algunas especificaciones del ambiente donde desarrollo la aplicación:
- Sistema Operativo: Windows XP (SP2)
- Base de datos: MySQL 4.1
- Ruby versión 1.8.4
- Rails versión 1.2.1
- RadRails como IDE de desarrollo (recomendada!)
Base de datos a UTF-8
Entonces hay que comenzar diciéndole a MySQL que maneje los caracteres en UTF-8. Luego de navegar un poco encuentro la forma y realmente funciona. En el directorio de instalación de MySQL, en el archivo my.ini, buscar la sección [mysqld] y ahí poner la configuración. Este es un pedazo de mi archivo, luego de configurarlo:
...
# CLIENT SECTION
# ----------------------------------------------------------------------
#
# The following options will be read by MySQL client applications.
# Note that only client applications shipped by MySQL are guaranteed
# to read this section. If you want your own MySQL client program to
# honor these values, you need to specify it as an option during the
# MySQL client library initialization.
#
[client]
port=3306
[mysql]
default-character-set=utf8
# SERVER SECTION
# ----------------------------------------------------------------------
#
# The following options will be read by the MySQL Server. Make sure that
# you have installed the server correctly (see above) so it reads this
# file.
#
[mysqld]
# The TCP/IP Port the MySQL Server will listen on
port=3306
#Path to installation directory. All paths are usually resolved relative to this.
basedir="C:/Archivos de programa/MySQL/MySQL Server 4.1/"
#Path to the database root
datadir="C:/Archivos de programa/MySQL/MySQL Server 4.1/Data/"
# The default character set that will be used when a new schema or table is
# created and no character set is defined
character-set-server=utf8
collation-server=utf8_spanish_ci
default-character-set=utf8
default-collation=utf8_spanish_ci
...
Decirle a Rails que la base de datos está en UTF-8
Luego hay que decirle a Rails que nuestra base de datos está en UTF-8, para esto editamos el archivo config/database.yml ; en mi caso la conexión a la base de datos de desarrollo, quedó así:
development:
adapter: mysql
database: soyconsumidor_development
username: sc
password: sc
host: localhost
encoding: utf8
IDE en UTF-8
Luego seguí con mi IDE de desarrollo que es RadRails. Esto si que fue fácil:
- Iniciar RadRails.
- Ir a Window / Preferences ... ; ahí se despliega un ventana de configuración.
- En el árbol de la izquierdad seleccionar: General / Workspace
- Buscar el panel con el título "Text file enconding"; ahí seleccionar la opción "Other" y luego de la lista desplegable seleccionar "UTF-8".
- OK.
Diciéndole a RoR que trabaje en UTF-8
También hay que habilitar RoR para que entienda que todo se va a manejar con UTF-8. Esto se hace en el archivo config/enviroment.rb ; poniéndole al final la siguiente instrucción:
$KCODE = 'u'
Como se está utilizando Rails 1.2.1, este no debe ser necesario ya que por defecto viene con $KCODE en UTF-8.
Enviando el HTML en UTF-8
Finalmente le puse una funcionalidad a la aplicación para que todo el contenido que se responda a los clientes vaya codificado (como no!) en UTF-8. Para lo anterior cree un filtro para que indique en los headers (los que no se ven) de las respuestas enviadas a los navegadores, cual es la codificación de caracteres que estoy utilizando. El filtro es un método en la clase ApplicationController que está escrita en app/controllers/application.rb :
# Filters added to this controller will be run for all controllers in the application.
# Likewise, all the methods added will be available for all controllers.
class ApplicationController < ActionController::Base
# filtros antes de enviarse la respuesta al browser
after_filter :set_content_type
# filtro para poner la codificaciones de caracters a UTF-8
def set_content_type
headers["Content-Type"] ||= "text/html; charset=utf-8"
end
end
En Rails 1.2 el Content-Type ya viene por defecto en UTF-8, así que tampoco debería ser obligatorio este paso.
Es bueno también poner en el tag <head> de los html construidos esta misma directiva.
Algo así como:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
Eso es todo...
Espero sus comentarios!