tri et caractères accentués

4 views
Skip to first unread message

Sébastien Lamy

unread,
Jan 22, 2009, 1:55:07 PM1/22/09
to rails...@googlegroups.com
Y-a-t-il une solution simple et propre pour trier un ensemble de chaines
de caractère contenant des accent?

Un exemple concrêt de mon problème

script/console
>> ["az","aea","aéb"].sort
=> ["aea", "az", "aéb"]

Bien sur, j'aimerais obtenir
["aea", "aéb", "az"]

Je n'ai pas su obtenir de réponse rapidement avec google, je m'en remet
donc à vos lumières!


Seb

Gregoire LEJEUNE

unread,
Jan 22, 2009, 3:04:14 PM1/22/09
to rails...@googlegroups.com
Voici une solution...

class String
def no_accent
require 'rubygems'
require 'htmlentities'

HTMLEntities.new.encode( self, :named ).gsub(
/\&([A-za-z])(?:acute|cedil|circ|grave|ring|tilde|uml)\;/, '\1'
).gsub( /\&([A-za-z]{2})(?:lig)\;/, '\1' ).gsub( /\&[^;]+\;/, '' )
end
end

["az","aea","aéb"].sort { |x, y| x.no_accent <=> y.no_accent }

Greg

Gregoire LEJEUNE

unread,
Jan 22, 2009, 3:17:47 PM1/22/09
to rails...@googlegroups.com
Hum...

C'était sans compter sur String.tr_s

Donc je propose :

class String
def no_accent
self.tr_s( 'ÁÀÂÄÃÅÇÉÈÊËÍÏÎÌÑÓÒÔÖÕÚÙÛÜÝáàâäãåçéèêëíìîïñóòôöõúùûüýÿ',
'AAAAAACEEEEEIIIINOOOOOUUUUYaaaaaaceeeeiiiinooooouuuuyy' )
end
end

["az","aea","aéb"].sort { |x, y| x.no_accent <=> y.no_accent }

Le 22 janvier 2009 21:04, Gregoire LEJEUNE
<gregoire...@gmail.com> a écrit :

Farzad FARID

unread,
Jan 22, 2009, 3:20:57 PM1/22/09
to rails...@googlegroups.com
Salut Greg et Sébastien,

Juste pour la forme, voici une version utilisant la libraire 'unicode'
plutôt que 'htmlentities', et avec un peu de magie :) La fonction n'est
pas de moi, elle avait été postée l'année dernière sur la ML Rubyfr-public.

http://gist.github.com/50689

Le 22.01.2009 21:04, Gregoire LEJEUNE a écrit :
> Voici une solution...
>
> class String
> def no_accent
> require 'rubygems'
> require 'htmlentities'
>
> HTMLEntities.new.encode( self, :named ).gsub(
> /\&([A-za-z])(?:acute|cedil|circ|grave|ring|tilde|uml)\;/, '\1'
> ).gsub( /\&([A-za-z]{2})(?:lig)\;/, '\1' ).gsub( /\&[^;]+\;/, '' )
> end
> end
>
> ["az","aea","aéb"].sort { |x, y| x.no_accent<=> y.no_accent }
>
> Greg
>
> Le 22 janvier 2009 19:55, Sébastien Lamy<lamy...@free.fr> a écrit :
>
>> Y-a-t-il une solution simple et propre pour trier un ensemble de chaines
>> de caractère contenant des accent?
>>
>> Un exemple concrêt de mon problème
>>
>> script/console
>> >> ["az","aea","aéb"].sort
>> => ["aea", "az", "aéb"]
>>
>> Bien sur, j'aimerais obtenir
>> ["aea", "aéb", "az"]
>>

--
Farzad FARID / Architecte Open Source - Associé
Pragmatic Source / http://www.pragmatic-source.com
Tel : +33 9 53 19 21 90 / Mob : +33 6 03 70 65 46

Gregoire LEJEUNE

unread,
Jan 22, 2009, 3:21:24 PM1/22/09
to rails...@googlegroups.com
Saperlipopette ! Il y a un E de trop...

Donc :

class String
def no_accent
self.tr_s( 'ÁÀÂÄÃÅÇÉÈÊËÍÏÎÌÑÓÒÔÖÕÚÙÛÜÝáàâäãåçéèêëíìîïñóòôöõúùûüýÿ',
'AAAAAACEEEEIIIINOOOOOUUUUYaaaaaaceeeeiiiinooooouuuuyy' )
end
end

2009/1/22 Gregoire LEJEUNE <gregoire...@gmail.com>:

francisoud

unread,
Feb 5, 2009, 4:20:47 AM2/5/09
to Railsfrance
Héhé, il faudra que je fasse un patch à mon projet http://naturalsort.rubyforge.org/
(pub perso gratos) avec une de ces bonnes idées ;)

On Jan 22, 9:21 pm, Gregoire LEJEUNE <gregoire.leje...@gmail.com>
wrote:
> Saperlipopette ! Il y a un E de trop...
>
> Donc :
>
> class String
>   def no_accent
>     self.tr_s( 'ÁÀÂÄÃÅÇÉÈÊËÍÏÎÌÑÓÒÔÖÕÚÙÛÜÝáàâäãåçéèêëíìîïñóòôöõúùûüýÿ',
>                'AAAAAACEEEEIIIINOOOOOUUUUYaaaaaaceeeeiiiinooooouuuuyy' )
>   end
> end
>
> 2009/1/22 Gregoire LEJEUNE <gregoire.leje...@gmail.com>:
>
> > Hum...
>
> > C'était sans compter sur String.tr_s
>
> > Donc je propose :
>
> > class String
> >  def no_accent
> >    self.tr_s( 'ÁÀÂÄÃÅÇÉÈÊËÍÏÎÌÑÓÒÔÖÕÚÙÛÜÝáàâäãåçéèêëíìîïñóòôöõúùûüýÿ',
> > 'AAAAAACEEEEEIIIINOOOOOUUUUYaaaaaaceeeeiiiinooooouuuuyy' )
> >  end
> > end
>
> > ["az","aea","aéb"].sort { |x, y| x.no_accent <=> y.no_accent }
>
> > Le 22 janvier 2009 21:04, Gregoire LEJEUNE
> > <gregoire.leje...@gmail.com> a écrit :
> >> Voici une solution...
>
> >> class String
> >>  def no_accent
> >>    require 'rubygems'
> >>    require 'htmlentities'
>
> >>    HTMLEntities.new.encode( self, :named ).gsub(
> >> /\&([A-za-z])(?:acute|cedil|circ|grave|ring|tilde|uml)\;/, '\1'
> >> ).gsub( /\&([A-za-z]{2})(?:lig)\;/, '\1' ).gsub( /\&[^;]+\;/, '' )
> >>  end
> >> end
>
> >> ["az","aea","aéb"].sort { |x, y| x.no_accent <=> y.no_accent }
>
> >> Greg
>
Reply all
Reply to author
Forward
0 new messages