Vous êtes ici : Accueil / Forums & ML / Forums Python / Forum général Python / pb de tri avec les accents

pb de tri avec les accents

Remonter à Forum général Python
  • pb de tri avec les accents

    Envoyé par Sinclair le 22 Mars 2006 à 09:37
    Salut à tous,

    Lorsque je trie des string python, le caractère accentué 'é' apparait après les autres lettres comme 'i', 'o', ...

    Comment obtenir un tri correct comprenant des caractère accentués ?

    Merci d'avance.
    • Re: pb de tri avec les accents

      Envoyé par tarek le 22 Mars 2006 à 09:56
      Salut,
      Pour le tri, il faut normaliser les chaîne (é->e, à->a).
      Pour ca il existe des utilitaires, comme zopyx.txng3

      Exemple ici:

      http://programmation-python.org/sections/blog/2006_02_25_decoupage-normalisation

      tu peux par exemple normaliser à la volée, dans une foncton de comparaison utilisée par les fonctions sort()
    • Re: pb de tri avec les accents

      Envoyé par haypo le 23 Mars 2006 à 01:00
      (Ignorez les « ~ » que j'ai ajouté pour contrer les "bugs" de ce forum)

      La lettre « é » a le code 233 dans les charsets Unicode et ISO-8859-1. La lettre « u » a le code ... euh ...

      >>> ord("u")
      117

      Or la fonction sort() utilise ces codes là pour faire le tri.

      Il existe la fonction unicodedata.decomposition() pour virer les accents, mais j'sais pas si ça marche avec toutes les langues. Exemple (repris de l'url donnée juste après) :

      # -*- encoding: utf-8 -*-
      import unicodedata

      def suppression_diacritics(s):
      def remove(char):
      deco = unicodedata.decomposition(char)
      if deco:
      return unichr(int(deco.split()[~0],16))
      return char
      return ''.join([~remove(a) for a in s])

      texte = unicode("bâjouérê", "utf-8")
      print suppression_diacritics(texte)

      texte = unicode("bağouå", "utf-8")
      print suppression_diacritics(texte)

      Affiche "bajouere" et "bagoua".

      Pour en savoir plus sur Python et Unicode :
      http://wikipython.flibuste.net/moin.py/JouerAvecUnicode

      Conseil : n'utiliez JAMAIS la notation « u"texte" » qui prête à confusion (quel est le charset utilisé ?). Il vaut mieux écrire explicitement « unicode("texte", "CHARSET"~)~».

      Haypo qui milite pour que Madame Michou utilise l'Unicode
    • Re: pb de tri avec les accents

      Envoyé par Sinclair le 25 Mars 2006 à 11:55
      Merci les gars !

      J'ai finalement utilisé la suppression des diacritics avec de l'unicode "latin-1" ("utf-8" ça marchait pas sur la chaine "Vélizy-Villacoublay" !!??) et un algo DSU.

      Ca marche au poil.
    • Re: pb de tri avec les accents

      Envoyé par haypo le 26 Mars 2006 à 02:14
      Oups, le bon entête est en fait :

      # -*- coding: utf-8 -*-

      Après, il faut écrire le bon encodage (à la place d'utf-8), définit selon ta "locale" et la configuration de ton éditeur de texte. Sous vi (par exemple), utilise la commande : « :set fileencoding utf-8 ».

      Haypo
    • Re: pb de tri avec les accents

      Envoyé par herve le 12 Juillet 2006 à 10:27
      haypo" a écrit:
      Conseil : n'utiliez JAMAIS la notation « u"texte" » qui prête à confusion (quel est le charset utilisé ?). Il vaut mieux écrire explicitement « unicode("texte", "CHARSET"~)~».

      Il n'y a aucune confusion si le « coding » est mentionné dans le fichier source.

      haypo" a écrit:
      Haypo qui milite pour que Madame Michou utilise l'Unicode

      Il faut surtout militer pour que les programmes que madame Michou utilise sachent parler Unicode et communiquer en UTF-8.
    • Re: pb de tri avec les accents

      Envoyé par lunatik le 12 Juillet 2006 à 11:29
      je suis d'avis de graver dans le marbre la recommendation d'hervé :)
Rendu par Ploneboard