Iconv et Ruby (le retour)

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'
...
Ce contenu a été publié dans Non classé. Vous pouvez le mettre en favoris avec ce permalien.