Dans un précédent article, je vous parlais de ma découverte sur les problèmes avec iconv influencé par les variables d’environnements.
En fait avec Ruby (1.8.6) ça se corse, car Ruby est aussi buggé.
Alors on recommence les explications.
L’influence de la variable d’environnement sur iconv :
$ echo éà | LANG=fr_FR.UTF-8 iconv -f UTF-8 -t ascii//translit ea $ echo éà | LANG=C iconv -f UTF-8 -t ascii//translit ??
Maintenant avec Ruby et Rails, ça se corse …
Dans un premier temps, on vérifie que tout est ok avec irb.
Avec irb, avec ‘C’
$ LANG=C irb irb(main):001:0> require 'iconv' => true irb(main):002:0> Iconv.iconv('ASCII//TRANSLIT', 'UTF-8', 'éèà') => ["???"] irb(main):003:0>
maintenant irb et fr_FR
$ LANG=fr_FR.UTF-8 irb irb(main):001:0> require 'iconv' => true irb(main):002:0> Iconv.iconv('ASCII//TRANSLIT', 'UTF-8', 'éèà') => ["eea"] irb(main):003:0>
Ok cool tout va bien 🙂
Maintenant le runner de Ruby On Rails
$ LANG=fr_FR.UTF-8 script/runner "puts Iconv.iconv('ASCII//TRANSLIT', 'UTF-8', 'ééà').inspect; puts ENV['LANG'].inspect" ["???"] "fr_FR.UTF-8"
Et là on s’arrache les cheveux … qu’on change ou pas dans config/environement.rb, le résultat est toujours le même
Et pour vérifier que le problème ne vient pas de Rails, mais vraiment de Ruby :
$ ruby -e "require 'iconv'; puts Iconv.iconv('ASCII//TRANSLIT', 'UTF-8', 'éèà').inspect; puts ENV['LANG'].inspect" ["???"] "fr_FR.UTF-8"
Donc on cherche un peu sur le net et la réponse est sur ruby-forum : en gros un problème d’initialisation de la variable d’environnement LC_TYPE.
Youpi … En plus Nobuyoshi Nakada nous explique comment faire son patch ..
Pour plus de simplicité et de pérennité, j’ai fait mon package. D’abord télécharger les sources de locale-bug.
Ensuite en tant que root :
$ tar -xvzf locale-bug.tgz $ cd locale-bug $ ruby extconf.rb $ make $ make install
Et dans votre application Rails (config/environment.rb) :
... require 'locale_bug' LocaleBug.ctype = 'fr_FR.UTF-8' require 'iconv' ...