Journal : Pourquoi je hais les locales

Posté par Troy McClure (page perso, ) le 16 janvier 2007
0
Mon cher journalounet,
Je ne suis en aucun cas un expert en matière d'i18n ou de localization, j'ai même été parfois pris en flagrant délit d'anti utf8isme primaire. Néanmoins je m'interroge très fortement sur la santé mentale des gens qui ont trouvé que c'était une bonne idée de localiser le séparateur décimal (cad virgule pour les français et point pour le reste du monde). Encore plus pour les quelques guignols qui ont jugé utile de rendre toutes les fonctions de "base" (atof, scanf etc) de la libc "locale-aware" alors qu'elles n'ont pas été conçues pour ça. Ainsi que le côté "global" de la locale: quand on fait un appel à setlocale ça s'applique à tout le monde dans l'appli: le programme comme les libs, et toutes les threads.

Alors à quoi on abouti, mon journalounet ? j'ai mon module python qui lit des fichiers de données. Ces fichiers sont en texte (pour la portabilité et la facilité d'édition), c'est de l'ascii tout gentil. Ils contiennent entre autres plein de nombres en virgule flottante. C'est du C à l'ancienne, sans fioritures ni headers exotiques. C'est du costaud, du robuste, ça a voyagé et vu plein d'Unix et de compilateurs différents. Tout marche bien, c'est super. Et là tout à coup je charge un autre module python, qui en charge un autre etc et dans le paquet y'en a un qui se dit "et si je faisais un setlocale pour bien causer la langue de l'autochtone?" . Et il le fait ce con. Et du coup, ben au lieu de lire des nombres à virgule flottante mon module ne lit plus que la partie à gauche du point décimal, parce qu'après il attend une virgule. Et qu'est-ce qui se passe ? ben ça bugge, le moteur gauche de la fusée demarre avec 0.5 seconde d'avance, elle part en vrille et va s'abattre sur la maison blanche, En représaille le président des Etats Unis d'Amerique appuie sur son bouton rouge et 3000 missiles vont s'abattre sur la russie et la corée du nord. Qui répliquent. Game over.

voilà pourquoi je hais les locales (et particulierement LC_NUMERIC)

> Lire le journal (50 commentaires, moyenne: 3,4).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

Je compatis

Posté par Guillaume Knispel () le 16/01/2007 à 12:46. (lien). Évalué à 10.

J'ai déjà rencontré le même problème sur une appli POSIX que j'ai devel, portable sous HP-UX, AIX, Solaris, Cygwin, Linux, etc...

Après de bonne prises de tête sur tous ces systèmes, je suis 100% d'accord avec toi : les locales Unix c'est de la merde en boite et moi aussi je m'interroge très fortement sur la santé mentale des gens qui ont spécifié ce bordel.

  • [^]Re: Je compatis

    Posté par Gniarf () le 16/01/2007 à 13:20. (lien). Évalué à 4.

    dans le genre j'ai un effet "interessant" sur certains sites comme MySpace (je regarde mes referer car j'héberge quelques images rigolotes) et je constate que la moitié de la page est en français et l'autre en anglais, mais bien subtilement mélangé.

    mon navigateur est réglé pour réclamer du contenu en anglais en priorité (le Accept-Language) et pas spécialement du français ou autre chose, mais comme ces génies ont décidé de se baser sur mon ip pour déterminer que je suis français, une bonne partie de l'application MySpace se retrouve en français, pas mal de chaines de caractères qu'ils ont localisées, mais pas le reste.

    bref, c'est un beau foutoir, et c'est surtout raté. caca.

    --
    "Je n'aime pas votre regard, baissez les yeux!" - Patrick Devedjian, 2008

Bof

Posté par Snarky (Jabber id, page perso, ) le 16/01/2007 à 12:48. (lien). Évalué à 7.

Y'en a bien qui parlent en Inch et d'autres en Mètres et ensuite ils se pleignent de crasher des satellites qui ont couté des millions sur Mars.... ^^
Alors, c'est pas parce que ton phalomètre indique 0.5 au lieu de 50 qu'il faut pleurer.

--
Milite pour un about:black sur les navigateurs ! (Sauvons la planète)

[+] perl

Posté par Mathieu Stumpf (Jabber id, page perso, ) le 16/01/2007 à 12:48. (lien). Évalué à -1.

Suffit de reformater ton fichier :


perl -pi -e "s/./,/g" ton_fichier

  • [^]Re: perl

    Posté par Putifuto () le 16/01/2007 à 12:52. (lien). Évalué à 3.

    "Ils contiennent entre autres plein de nombres en virgule flottante."

    ou l'art de flinguer un fichier de données.

    Je pense que la solution serait d'utiliser un format xml pour le stockage des données :-)

    Il y en a marre de devoir écrire des tonnes de parseurs buggés tout le temps.

    --
    http://linuxfr.org/board <-- des moules, du sang, de la violence
    • [^]Re: perl

      Posté par Thierry Boudet (page perso, ) le 16/01/2007 à 13:19. (lien). Évalué à 10.

      je pense que la solution serait d'utiliser un format xml pour le stockage des données

      Quand tu exposes un problème que tu as en informatique, il y a toujours une bonne âme pour te proposer une solution avec XML. Ensuite, tu as DEUX problèmes...

      • [^]Re: perl

        Posté par Putifuto () le 16/01/2007 à 13:24. (lien). Évalué à 2.

        Quand on fait une citation, il est plus honnête de laisser le smiley qui indique la déconnade.

        Maintenant, la horde de moinsseurs de panurge vont s'abattre sur mon misérable petit post.

        --
        http://linuxfr.org/board <-- des moules, du sang, de la violence
        • [+] [^]Re: perl

          Posté par Gniarf () le 16/01/2007 à 17:47. (lien). Évalué à -3.

          Quand on fait des smileys, il est préférable d'en connaitre l'usage approprié.

          --
          "Je n'aime pas votre regard, baissez les yeux!" - Patrick Devedjian, 2008
      • [^]Re: perl

        Posté par Krunch (Jabber id, page perso, ) le 16/01/2007 à 13:29. (lien). Évalué à 2.

        AFAIK à la base on (jwz ?) disait ça pour les expressions rationnelles donc tout le monde à tord dans ce thread en fait.

        --
        Free Softwares Users Group Arlon (Sud Luxembourg, Belgique)
        pertinent, e adj. Approprié ; qui se rapporte exactement à ce dont il est question.
        • [^]Re: perl

          Posté par Jebediah Tramo () le 16/01/2007 à 13:39. (lien). Évalué à 4.

          donc tout le monde à tord

          Et surtout toi, car, ne l'oublions pas, le tord due !

    • [^]Re: perl

      Posté par taratatatata () le 16/01/2007 à 14:40. (lien). Évalué à 10.

      XML is like violence : if it doesn't work, use more.

    • [^]Re: perl

      Posté par alpage (Jabber id, page perso, ) le 16/01/2007 à 18:12. (lien). Évalué à 1.

      Moi je vote pour le format binaire optimisé, léger et tellement plus fun :-)

  • [^]Re: perl

    Posté par Thomas Douillard () le 16/01/2007 à 12:52. (lien). Évalué à 2.

    Ou ptete un (pseudocode)

    -> setlocale(localeinit)

    parsing du fichier

    -> setlocale(localedest)

    (ré)écriture du fichier



    Ceci suppose bien évidemment de connaître la locale init et la locale dest. C'est un problème parce que c'est rarement gardé (idéalement ça devrait être des metas-données du fichiers) et que dans les vieux progs on s'en foutais.

    • [^]Re: perl

      Posté par Troy McClure (page perso, ) le 16/01/2007 à 12:57. (lien). Évalué à 4.

      en plus le setlocale c'est pas super thread-safe donc si t'as un autre thread en même temps qui lit des trucs ça risque de pas être beau

  • [^]Re: perl

    Posté par Krunch (Jabber id, page perso, ) le 16/01/2007 à 13:22. (lien). Évalué à 1.

    $ echo 13,37 | perl -pe's/./,/g'
    ,,,,,

    Avec le -i sans argument ça aurait été beau tiens.

    --
    Free Softwares Users Group Arlon (Sud Luxembourg, Belgique)
    pertinent, e adj. Approprié ; qui se rapporte exactement à ce dont il est question.
  • [^]Re: perl

    Posté par Guillaume Rossignol () le 16/01/2007 à 18:49. (lien). Évalué à 2.

    On pourrait peut etre verifier qu'il y a des nombres avant et apres le point pour etre sur d'etre sur un nombre flottant et changer le . que dans ce cas

    • [^]Re: perl

      Posté par briaeros007 () le 16/01/2007 à 21:15. (lien). Évalué à 2.

      dans ce cas
      cat file | sed 's/\([0-9]\),\([0-9]\)/\1\.\2/g'

      et pas besoin de perl
      (pas besoin de perl avant non plus ;))

      --
      Subete ga wakatta toki…watashi ga anta wo korosu.
      • [^]Re: perl

        Posté par Smarter () le 16/01/2007 à 21:42. (lien). Évalué à 1.

        Alors autant y aller comme ça:
        sed -i 's/\([0-9]\),\([0-9]\)/\1\.\2/g' monfichier
        si le but c'est de modifier le fichier de base.

        • [^]Re: perl

          Posté par Moonz () le 17/01/2007 à 07:32. (lien). Évalué à 2.

          oui, mais avec perl tu peux utiliser les look around (quelqu'un connaitrait le terme francisé, d'ailleurs ?) :)
          s/(?<=\d)(?=\d),/./

[+] ouais bofff

Posté par Nicolas Boulay () le 16/01/2007 à 12:53. (lien). Évalué à -3.

tu fais un s/,/\./ ou l'inverse et cela marche pareil. (c'est facile uniquement si le parseur de fichier est bien écris...)

Sacrebleu, encore une exception française !

Posté par maitre_foo () le 16/01/2007 à 13:07. (lien). Évalué à 10.

cad virgule pour les français et point pour le reste du monde


Il n'y a vraiment que la France pour utiliser la virgule. Et quelques autres pays*, mais bon ils ne comptent pas.

* Albania, Andorra, Argentina, Austria, Azerbaijan, Belarus, Belgium, Bolivia, Bosnia and Herzegovina, Brazil, Bulgaria, Cameroon, Canada, Costa Rica, Croatia, Cuba, Chile, Colombia, Cyprus, Czech Republic, Denmark, Ecuador, Estonia, Faroes, Finland, Germany, Greece, Greenland, Hungary, Indonesia, Iceland, Italy, Latvia, Lithuania, Luxembourg, Macedonia, Moldova, Netherlands, Norway, Paraguay, Poland, Portugal, Romania, Russia, Serbia, Slovakia, South Africa, Slovenia, Spain, Sweden, Switzerland, Turkey, Ukraine, Uruguay, Venezuela, Vietnam, Zimbabwe

  • [^]Re: Sacrebleu, encore une exception française !

    Posté par niconux (page perso, ) le 16/01/2007 à 13:46. (lien). Évalué à 8.

    Tu oublies Groland !

    • [^]Re: Sacrebleu, encore une exception française !

      Posté par Gmooron (page perso, ) le 16/01/2007 à 14:50. (lien). Évalué à 10.

      Non, eux ils utilisent le point virgule !

utiliser aussi les locales ?

Posté par Dreammm () le 16/01/2007 à 13:10. (lien). Évalué à 6.

Et si tout simplement tu utilisais toi aussi les locales ?

A savoir ici donc positionner la locale C. Ton bousin ne marcherait-il pas direct ?

Tu fais un wrapper autour de ton executable qui positionne les locales à C, et le tour est joué non ?

Personnellement, c'est ce que je fais pour éviter les emmerdres avec les trucs prélocales. Si ça peut aider ...

meme souci en php

Posté par Laurent J (page perso, ) le 16/01/2007 à 13:26. (lien). Évalué à 4.

Si tu fais un setlocale dans un script, la modif s'applique à tous les autres scripts en cours d'execution. Super.

http://fr2.php.net/setlocale (section warning)

Franchement, c'est pourri...

  • [^]Re: meme souci en php

    Posté par popopo333 () le 16/01/2007 à 13:33. (lien). Évalué à 2.

    elle s'applique aux threads du meme processus.
    ce qui veut donc dire que dans beaucoup de cas, ca fonctionnera bien comme il faut et dans beaucoup d'autres cas et ben ca fonctionnera pas bien....

T'embales pas

Posté par Victor STINNER (page perso, ) le 16/01/2007 à 14:19. (lien). Évalué à 8.

« je charge un autre module python, qui en charge un autre etc et dans le paquet y'en a un qui se dit "et si je faisais un setlocale pour bien causer la langue de l'autochtone?" . Et il le fait ce con. »

Seul le programme principal doit changer de locale car :
- c'est pas thread safe
- vaut mieux ne changer qu'une seule fois de locale (à cause de trucs vaudou, cherchez pas)
- un module n'a pas à imposer sa locale

Corrige le module en question pour éviter une 3e guerre mondiale.

  • [^]Re: T'embales pas

    Posté par Ben (Jabber id, page perso, ) le 16/01/2007 à 14:48. (lien). Évalué à 5.

    complètement d'accord. c'est un bug du module. J'ai eu le même genre de problème en C.

    Ne pas oublier de faire un bugreport chez les auteurs du module, ou via bugreport (si tu as une Debian) sinon ca va trainer dans les greniers pendant 5 ans.

Comme quoi le Python, ça pux !

Posté par Raphaël SurcouF (Jabber id, page perso, ) le 16/01/2007 à 15:46. (lien). Évalué à 3.

Et peux-tu nous dire quel est le petit module coupable qu'on puisse châtier son auteur comme il le mérite ?

  • [^]Re: Comme quoi le Python, ça pux !

    Posté par Krunch (Jabber id, page perso, ) le 16/01/2007 à 16:15. (lien). Évalué à 2.

    $ locate py | grep py$ | xargs grep -i setlocale
    (apparement j'ai aucun module comme ça chez moi)

    --
    Free Softwares Users Group Arlon (Sud Luxembourg, Belgique)
    pertinent, e adj. Approprié ; qui se rapporte exactement à ce dont il est question.
    • [^]Re: Comme quoi le Python, ça pux !

      Posté par rewind () le 16/01/2007 à 16:34. (lien). Évalué à 2.

      chez moi il dit :
      /usr/lib/python2.4/lib-tk/tkFileDialog.py
      /usr/lib/python2.4/xml/sax/saxutils.py
      /usr/lib/python2.4/xml/sax/xmlreader.py

      • [^]Re: Comme quoi le Python, ça pux !

        Posté par Krunch (Jabber id, page perso, ) le 16/01/2007 à 17:54. (lien). Évalué à 3.

        Pour saxutils et xmlreader c'est des faux positifs : ils définissent des fonctions qui permettent de changer les locales mais ne les utilisent apparement pas. Faut faire un peu de filtrage manuel.

        --
        Free Softwares Users Group Arlon (Sud Luxembourg, Belgique)
        pertinent, e adj. Approprié ; qui se rapporte exactement à ce dont il est question.
  • [^]Re: Comme quoi le Python, ça pux !

    Posté par Troy McClure (page perso, ) le 16/01/2007 à 16:42. (lien). Évalué à 3.

    je ne l'ai pas dévoilé d'emblée parce que ça aurait sans doute un peu détourné la discussion de son cours, mais ce petit bout de code est assez éloquent:

    import wx
    import locale
    print locale.getlocale()
    app=wx.App();
    print locale.getlocale()


    en sortie:

    (None, None)
    ('fr_FR', 'utf-8')


    A vrai dire j'ai encore du mal à y croire parce qu'un coup de google montre que ce problème est connu depuis au moins 2001..:
    http://lists.wxwidgets.org/archive/wxPython-users/msg12329.h(...)

    • [^]Re: Comme quoi le Python, ça pux !

      Posté par Jebediah Tramo () le 16/01/2007 à 18:06. (lien). Évalué à 9.

      Tu n'as qu'à remplacer WX par QT, comme tout le monde...

      • [+] [^]Re: Comme quoi le Python, ça pux !

        Posté par Raphaël SurcouF (Jabber id, page perso, ) le 17/01/2007 à 09:33. (lien). Évalué à -1.

        Tu voulais dire par GTK+, je présume ? ;-)

        • [^]Re: Comme quoi le Python, ça pux !

          Posté par miod () le 17/01/2007 à 15:23. (lien). Évalué à 3.

          Il ne peut pas : il n'y a pas le même nombre de lettres entre WX (ou QT) et GTK+...

[+] A verifier ?

Posté par André Rodier (page perso, ) le 16/01/2007 à 16:25. (lien). Évalué à -4.

open( filename[, mode[, bufsize]])
Open a file, returning an object of the file type described in section 3.9, ``File Objects''. [...]

If mode is omitted, it defaults to 'r'. When opening a binary file, you should append 'b' to the mode value to open the file in binary mode, which will improve portability.(Appending 'b' is useful even on systems that don't treat binary and text files differently, where it serves as documentation.)
...
Source : http://docs.python.org/lib/built-in-funcs.html

D'autant plus que...

Posté par VoixOff () le 16/01/2007 à 18:25. (lien). Évalué à 2.

... http://www.bipm.fr/jsp/fr/ViewCGPMResolution.jsp?CGPM=22&(...)

  • [^]Re: D'autant plus que...

    Posté par Infernal Quack (Jabber id, page perso, ) le 16/01/2007 à 20:28. (lien). Évalué à 2.

    Encore une norme inachevée. Personne n'aura les couilles de spécifier clairement et en toutes lettres :
    - le séparateur décimal est le point "."
    - le séparateur par tranche de trois ne pourra être que l'espace " "

    Parce qu'avec leur résolution inachevée à la noix on peut penser qu'on peut écrire :
    15@000.00 + 8#071#042,36 = 8"086"042.36

    Avec des bras cassés comme eux on en serait encore à mesurer en pouces ! Qui ? Quoi ? Les anquois ?

    • [^]Re: D'autant plus que...

      Posté par tinodeleste () le 16/01/2007 à 22:08. (lien). Évalué à 4.

      tout ca ne vaut pas les applis qui pour sortir un csv utilisent ',' pour séparer les décimales, et ',' pour séparer les champs, saufs qu'ils mettent des '"' autour de certains champs pour qu'on puisse faire la différence entre les ',' et les ',' quand on a besoin des ',' pour écrire un réel...

coupable ?

Posté par Éric (Jabber id, page perso, ) le 16/01/2007 à 20:45. (lien). Évalué à 2.

Le problème ici ce n'est pas qu'on ait une locale, c'est que la locale ne corresponde pas au fichier en entrée non ?

Je peux voir plusieurs responsables (au choix) :
- celui qui a écrit le fichier, qui a bêtement mis un point au lieu d'utiliser la bonne locale
- celui qui a lancé le programme et qui l'a lancé avec une locale différente de la locale des données en entrée
- celui qui a configuré le système et qui a définit une locale non posix alors qu'il avait des programmes qui ne comprennent pas les locales ou qui imposent une locale différente
- ceux qui ont décidé que tout les pays n'utilisent pas les mêmes conventions/langues/alphabets/unités/monnaies (bonne chance pour les individualiser ceux là ;)

Si j'en crois ce que je lis plus haut ton module a changé la locale du programme principale et ça c'est mal, effectivement. Mais globalement les locales le problème ce n'est pas leur existence c'est celui qui les configure mal.

  • [^]Re: coupable ?

    Posté par fmaz fmaz () le 17/01/2007 à 08:47. (lien). Évalué à 3.

    Et si on échange des fichiers avec quelqu'un qui n'utilise pas la même locale ?

    • [^]Re: coupable ?

      Posté par ccomb (Jabber id, page perso, ) le 17/01/2007 à 09:32. (lien). Évalué à 0.

      c'est pas prévu, c'est comme si tu disais « et si j'envoie un courrier en français à quelqu'un qui ne parle pas français ? ».

    • [^]Re: coupable ?

      Posté par Éric (Jabber id, page perso, ) le 18/01/2007 à 17:03. (lien). Évalué à 0.

      On se met d'accord sur une convention ?
      Tu le fais déjà (probablement) pour le codage caractère, le type de fin de ligne, la langue, le format de date, les délimiteurs entre tes différentes données, ...

  • [^]Re: coupable ?

    Posté par Troy McClure (page perso, ) le 17/01/2007 à 09:54. (lien). Évalué à 5.

    Alors effectivement, je serais d'accord avec ton point de vue si le fichier en question était en quelque sorte un fichier final, le but du traitement. Mais ça ne l'est pas, c'est juste un fichier de données sources que j'injecte dans le bouzin, et il n'y a absolument aucune raison de le faire dépendre d'une locale. C'est comme si on demandait aux developpeurs francophones d'ecrire les nombres flottants avec une virgule au lieu d'un point dans leur code source !

    Ce qui me fout en rogne c'est qu'avec la libc on a pas le choix, au lieu de définir une famille de fonctions localisées du genre "atof_loc", "scanf_loc" etc ils ont choisi de modifier le comportement des fonctions de base et ça c'est une belle connerie.

    • [^]Re: coupable ?

      Posté par Laurent Pointal (page perso, ) le 17/01/2007 à 10:05. (lien). Évalué à 5.

      Je plussoie.

      Ca s'appelle un effet de bord, ça change le fonctionnement attendu de fonctions, et ça ne devrais pas être.

      Ils auraient pu définir qq chose comme:

      locale_t* get_locale(const char* localename) ;
      locale_t* get_user_locale() ; ou get_console_locale()

      et en effet des fonctions du style:

      double atof_loc(locale_t* loc, const char* s) ;

      Ca permettrais accessoirement de pouvoir travailler avec différentes locales...

      Comme l'a écrit GVR pour Python: explicit is better than implicit.

      --
      (pub: Livres à prix réduit sur http://www.sollire.com/ - la boutique de mes petites soeurs)
    • [^]Re: coupable ?

      Posté par Éric (Jabber id, page perso, ) le 18/01/2007 à 17:08. (lien). Évalué à 2.

      il y aurait pu y avoir deux fonctions, une localisée et une sur laquelle on peut compter quel que soit le contexte. Je te l'accorde avec grand plaisir.



      Par contre je ne suis pas d'accord sur le "aucune raison de dépendre d'une locale". Ton fichier dépend forcément d'une convention sur quoi mettre comme séparateur. Prendre comme convention de mettre le séparateur de ton pays n'est pas forcément plus crétin que prendre comme convention le séparateur d'un pays tierce.

      > Alors effectivement, je serais d'accord avec ton point de vue si le
      > fichier en question était en quelque sorte un fichier final, le but du
      > traitement. Mais ça ne l'est pas, c'est juste un fichier de données
      > sources que j'injecte dans le bouzin

      Si je peux me permettre, ça ça n'a aucun sens. Parce que si le fichier est "source" pour toi, il est "final" pour quelqu'un d'autre, une application ou un humain.
      Dire que la locale est pertinente en sortie mais pas en entrée c'est impliquer que les fichiers en entrée naissent par génération spontanée.

Précision de vocabulaire...

Posté par Calim' Héros (Jabber id, page perso, ) le 17/01/2007 à 21:03. (lien). Évalué à 6.

On dit les autochtones et non les locales.

--
Ce commentaire est : Génial, Null, 42.
  • [^]Re: Précision de vocabulaire...

    Posté par Gilles G. () le 18/01/2007 à 08:16. (lien). Évalué à 3.

    Non non!
    On dit les locaux.

Revenir en haut de page