Bonjour,

Le 20/10/2010 16:13, Yannick VOYEAUD a écrit :

Cela je l'ai bien compris. Il faut un code à chaque lettre.
Il y a les 'lettres' standards et les mêmes lettres accompagnées.
Chacune a son code. Que ce code ne soit pas linéaire peut se comprendre.
Les anglophones ont imposés leurs critères créant une belle pagaille
pour les autres mais c'est comme cela et il faut faire avec maintenant.

Sauf qu’en l’occurrence, même si les codes caractères suivaient une logique linéaire entre les caractères affiliés, ça ne résoudrait aucunement votre problème, puisque dans la logique du tri naturel les caractères affiliés (comme e, é, è, ê et ë) doivent avoir une valeur _identique_. Même avec une valeur proche, ça ne fonctionnerait pas.


Je pense à un truc du genre Lettre bizarre ==> Lettre normale

Oui, il faut créer une table d’association pour transcrire chaque caractère avec diacritique ou ligature en élément simplifié (c’est-à-dire en lettre ASCII).

Comme c’est une chose que j’ai fait moi-même pour l’établissement du dictionnaire (trié naturellement, avec une sensibilité sur la casse), je vous donne le code en Python 3:


dCHARREP = { 'à': 'a',  'À': 'a',  'â': 'a',  'Â': 'a',  'ä': 'a',
             'Ä': 'a',  'å': 'a',  'Å': 'a',  'ç': 'c',  'Ç': 'c',
             'é': 'e',  'É': 'e',  'è': 'e',  'È': 'e',  'ê': 'e',
             'Ê': 'e',  'ë': 'e',  'Ë': 'e',  'î': 'i',  'Î': 'i',
             'ï': 'i',  'Ï': 'i',  'ñ': 'n',  'ô': 'o',  'Ô': 'o',
             'ö': 'o',  'Ö': 'o',  'ù': 'u',  'Ù': 'u',  'û': 'u',
             'Û': 'U',  'ü': 'u',  'Ü': 'U',  'ÿ': 'y',
             'æ': 'ae', 'Æ': 'ae', 'œ':'oe',  'Œ': 'oe',
             '-': None, '.': None, "'": None }

CHARMAP = str.maketrans(dCHARREP)


Ensuite, il suffit, lorsqu’on veut comparer des entrées, de faire une comparaison sur des chaînes transcrites. On transcrit une chaîne «myvar» avec:

myvar.translate(CHARMAP)

Si vous avez d’autres caractères à trier, il suffit de les ajouter dans le dictionnaire dCHARREP.

Mais bon, c’est du Python, c’est simple et puissant. Après il faut programmer ça en C++. Vingt fois plus de lignes à écrire, et des maux de tête en prime. ;)


Cordialement,
--
Olivier R.

== Adresse mail réservée aux listes de discussion.                ==
== Les messages venant d’ailleurs sont _automatiquement_ effacés. ==
** E-mail dedicated to mailing-lists.                             **
** Messages from anywhere else are _automatically_ erased.        **

--
E-mail to discuss+h...@fr.libreoffice.org for instructions on how to unsubscribe
List archives are available at http://fr.libreoffice.org/lists/discuss/
All messages you send to this list will be publicly archived and cannot be 
deleted

Répondre à