rails,ajax,charset (i)
Posted by javier ramirez on November 4, 2006
Los que programamos en español/castellano ya estamos acostumbrados a que el juego de caracteres que necesitamos no esté soportado por defecto y tengamos que trabajar un poco para que todo funcione como debería.
En rails, y si queremos utilizar una codificación ISO-8859-1, esto lo arreglamos metiendo en nuestro layout una referencia al charset en el código html, y definiendo además un filtro de controlador que haga algo como lo siguiente
def set_charset
@headers[‘Content-Type’] = “text/html; charset=ISO-8859-1” unless request.xhr?
end
El motivo de meterle la condición de que no sea una llamada xhr? es que si en un response de ajax ponemos el content-type a text/html, va a dar un error.
Si probamos a hacer esto en nuestra aplicación, veremos que todo se muestra bien. Ya no hay caracteres extraños y aparentemente todo va bien… hasta que se nos ocurre usar ajax.
Como antes decía, en una respuesta desde ajax no podemos poner el content-type con valor html porque nos va a dar un error; pero si no lo indicamos, es muy probable que el browser no sepa el encoding con el que estamos trabajando y acabe usando el que tengamos por defecto o UTF-8. De nuevo volvemos a tener caracteres extraños.
¿Solución? Para las llamadas vía ajax, podemos usar el content-type con valor “text/javascript”. Esto le indica al browser que lo que viene es código javascript y adicionalmente podemos indicarle el encoding apropiado.
El código del filtro de controlador modificado para que el charset sea consistente entre llamadas ajax y llamadas no ajax sería:
def set_charset
str_type = request.xhr? ? ‘javascript’ : ‘html’
@headers[‘Content-Type’] = “text/#{str_type}; charset=ISO-8859-1”
end
Ahora ya podemos ver como todo nuestro contenido, sea petición http directa o sea una llamada vía ajax, se muestra con el encoding deseado.
… lo malo vendrá cuando queramos desde ajax enviar contenido al servidor… pero eso lo contaremos más adelante. Mantén tu rss a la escucha!!!
searchwords: charset, utf-8, iso-8859-1, iconv, prototype.js, javascript, encodeURIComponent, ajax
rails,ajax,charset (ii) « format internet: said
[…] rails,ajax,charset (i) […]