Francescu e Dume

THE ROAD TOWARDS FREEDOM

Ruby on Rails - Résolution du problèmes des accents avec l’encodage UTF-8


Grrrr, des ? à la place des é, des ? à la place des à, des ? à la place des ê…
D’où cela vient il ?
Sans aucune requête, en tapant juste des mots ayant des accents dans mes fichiers de Views, il y avait déjà un problème. En forçant l’encodage de Firefox en de l’ISO-8859-1 ça marche… Je change donc l’encodage de mon layout principal grâce au charset classique, en HTML grâce aux métas… Rien y fait. Je cherche sur internet, je trouve des personnes ayant le même problème mais seulement lors des requêtes à la base de donnée, ou Ajax. Après réflexion mon cerveau en à déduit que cela venait de l’éditeur… et oui RadRails utilisant par défaut un lugubre encodage, il fallait aller dans les préférences pour changer cela.
C’est tout ?
Mais non, c’est là que j’ai eu droit aux accents qui buggent lors des requêtes mais cela me rassurait, je n’était plus seul au monde, le problème semble fleurir sur Internet.
Et alors ?
La solution viens d’un petit bout de code à mettre dans son application.rb

before_filter :set_charset_db
  def set_charset_db
    suppress(ActiveRecord::StatementInvalid) do
      ActiveRecord::Base.connection.execute SET NAMES UTF8
    end
  end
 
  after_filter :set_charset_header
 
  def set_charset_header
    content_type = headers["Content-Type"] || text/html
    if /^text\//.match(content_type)
      headers["Content-Type"] = #{content_type}; charset=utf-8 
    end
  end

Comment ça se fait ?
La première partie du code se charge d’envoyer une requête “SET NAMES UTF8″ avant vos requêtes qui enfin dit à MySQL de prévenir le serveur qu’il reverra de l’UTF8:

SET NAMES indicates what character set the client will use to send SQL statements to the server. Thus, SET NAMES 'cp1251' tells the server “future incoming messages from this client are in character set cp1251.” It also specifies the character set that the server should use for sending results back to the client. (For example, it indicates what character set to use for column values if you use a SELECT statement.)

La partie after_filter concerne les requêtes en général, en gros le principe du code est de forcer l’encodage (charset) - dans le header de toutes les requêtes (de type text/html) - en UTF-8.

Il semblerait que ce code sera intégré au Framework 1.2.
Un grand merci à lanfeust21 de #rubyonrails.fr pour m’avoir montré cette solution.

Pas encore de commentaires. Soyez le premier

Laisser une réponse