Re: Chiffres romains, locale et tri
Le 12953ième jour après Epoch,
Frédéric Bothamy écrivait:
> * Jacques L'helgoualc'h <lhh+no_spam@free.fr> [2005-06-19 15:10] :
>> François TOURDE a écrit, dimanche 19 juin 2005, à 13:42 :
>> > Jacques L'helgoualc'h écrivait:
>> [...]
>> > > $ LC_ALL=fr_FR sort fichier
>> > > Dvorak_Symphony_n°7_in_D_Minor_op.70_I-Allegro
>> > > Dvorak_Symphony_n°7_in_D_Minor_op.70_III-Scherzo
>> > > Dvorak_Symphony_n°7_in_D_Minor_op.70_II-Poco
>> > > Dvorak_Symphony_n°7_in_D_Minor_op.70_IV-Finale
>> >
>> > Pas mal! Si Dvorak avait nommé son second mouvement Andante, alors ça
>> > aurait marché. Ne me demande pas pourquoi, je viens de tester ça sur
>> > ma machine (même version de sort), et j'ai pareil que toi. Si je
>> > change Poco pour Andante, alors le tri est correct.
>>
>> C'est un « Poco adagio » (j'ai coupé toute la fin) ; avec « Adagio ma
>> non troppo » ça irait aussi.
>>
>> En LC_ALL=C on retrouve le même désordre avec « sort -d », qui ignore
>> les _- ... Est-ce que ce ne serait pas un bogue local de ce pu^Hcoquin
>> de sort ?
>
> À mon avis, probablement pas. D'après la page Info de coreutils :
>
> (1) If you use a non-POSIX locale (e.g., by setting `LC_ALL' to
> `en_US'), then `sort' may produce output that is sorted differently
> than you're accustomed to. In that case, set the `LC_ALL' environment
> variable to `C'. Note that setting only `LC_COLLATE' has two problems.
> First, it is ineffective if `LC_ALL' is also set. Second, it has
> undefined behavior if `LC_CTYPE' (or `LANG', if `LC_CTYPE' is unset) is
> set to an incompatible value. For example, you get undefined behavior
> if `LC_CTYPE' is `ja_JP.PCK' but `LC_COLLATE' is `en_US.UTF-8'.
>
> En fait, avec une locale fr_FR, sort utilise les chaînes suivantes pour
> faire les comparaisons :
>
> ...IAllegro...
> ...IIPoco...
> ...IIIScherzo...
> ...IVFinale...
>
> (on peut s'en rendre compte en remplaçant le '-' par un 'A' par exemple).
>
> "LC_ALL=C sort ..." ou "LC_COLLATE=C sort ..." fait ce qu'il semble
> normal en incluant le caractere - dans sa comparaison.
Ah, si les romains avaient connu le zéro, tu aurais pû générer tes
nombres avec un truc du genre:
printf("%05R", num);
:)
fermat:~$ for i in $(seq 1 8); do printf "%05R\n" $i; done
ZZZZI
ZZZII
ZZIII
ZZZIV
ZZZZV
ZZZVI
ZZVII
ZVIII
Ah ben non.. Le zéro romain est Z :(
/F - Qui ne sait pas quoi faire d'autre avec cette canicule.
Reply to: