Ruby Forum Rails France > remplacer les accents d'un enregistrement en utf8...

Posted by Frioffol Friofool (friofool)
on 03.03.2008 01:34
Salut,

Je souhaiterai remplacer les accents d'une chaine provenant d'une table
encodée en UTF8 pour formater des urls correctes.

Evidement ça ne marche pas.

Mon code :

----
  source = "àâéè"
  dest = "aaee"

  option = Option.find(:all)

  nomOption = option.libelle_option
  nomOption = nomOption.tr(source,dest)

----

Les accents ne sont pas remplacés avec cette méthode.

Est ce qu'il y a un moyen différent de le faire ?
Est ce que l'encodage pose problème et si oui comment contourner le
problème ?

Merci...
Posted by Frederic de Villamil (Guest)
on 03.03.2008 08:00
(Received via mailing list)
Le 3 mars 08  01:34, Frioffol Friofool a crit :

>
> Les accents ne sont pas remplacs avec cette mthode.
>
> Est ce qu'il y a un moyen diffrent de le faire ?
> Est ce que l'encodage pose problme et si oui comment contourner le
> problme ?
>
> Merci...
> -- 

Bonjour

J'utilise a dans Typo :

     accents = { ['','','','','','','','',''] => 'a',
       ['','','','','','','',''] => 'e',
       ['','','','','I','',''] => 'i',
       ['','','','','','','','',''] => 'o',
       [''] => 'oe',
       [''] => 'ss',
       ['','','','','U','',''] => 'u',
       ['',''] => 'c'
       }
     accents.each do |ac,rep|
       ac.each do |s|
         str.gsub!(s, rep)
       end
     end

Et a marche plutt bien (sans compter le nombre important de
caract`eres pris en compte)

Bonne 
journeFred
Posted by Yann KLIS (Guest)
on 03.03.2008 14:08
(Received via mailing list)
J'utilise le gem "unicode" pour faire a.

require 'unicode'

class String
  def to_slug
    str = Unicode.normalize_KD(self).gsub(/[^\x00-\x7F]/n,'')
    str = str.gsub(/\W+/, '-').gsub(/^-+/,'').gsub(/-+$/,'').downcase
  end
end



++

yk

Le 03/03/08, Frioffol Friofool<list-incoming@andreas-s.net> a crit :
Posted by Thibaut Barrère (thbar)
on 04.03.2008 16:18
(Received via mailing list)
Hello,

une solution de plus si tu es dans Rails (je m'en sers dans Comatose):

module DiacriticsFu
  def self.escape(str)

ActiveSupport::Multibyte::Handlers::UTF8Handler.normalize(str,:d).split(//
u).reject { |e| e.length > 1 }.join
  end
end

la RSpec en bas de ce message si tu es intéressé!

Thibaut Barrère / LoGeek
--
http://blog.logeek.fr - learning content for developers
http://evolvingworker.com - tools for a better day


============= diacritics_fu_spec.rb =========================

require File.dirname(__FILE__) + '/../spec_helper'
require 'diacritics_fu'

describe "DiacriticsFu.escape" do

  it "should remove the accents with grace" do
    DiacriticsFu::escape("éphémère").should eql("ephemere")
    DiacriticsFu::escape("éêèïîù").should eql("eeeiiu")
  end

  it "should work" do
    DiacriticsFu::escape("räksmörgås").should eql("raksmorgas")
  end

  KNOWN_DIACRITICS = { "a" => "àäâ", "e" => "éèêë", "i" => "îï", "o"
=> "ôö", "u" => "üû", "c" => "ç",
                       "I" => "ÏÎ",  "E" => "ÊË", "n" => "ñ", "O" =>
"ÔÖ", "Y" => "Ÿ", "y" => "ÿ", "N" => "Ñ"  }

  KNOWN_DIACRITICS.each do |expected_replacement,originals|
    it "should transform any of '#{originals}' into
'#{expected_replacement}'" do
      originals.split(//).each do |original|
        DiacriticsFu.escape(original).should eql(expected_replacement)
      end
    end
  end

end
Posted by Thomas (Guest)
on 04.03.2008 21:33
(Received via mailing list)
Bonjour Thibaut,

J'ai essay d'implmenter votre code comme monkeypatch au plugin
PermalinkFu, mais cela n'a pas fonctionn. L'avez-vous dj fait? En
avez-vous parl  Rick Olson l'auteur du plugin?

Je ne comprends pas comment est structur le plugin PermalinkFu car il
n'y a aucun commentaires.
Posted by Thomas (Guest)
on 04.03.2008 21:37
(Received via mailing list)
Ha ben en fait je viens d'y arriver. J'avais oubli qu'il fallait
redmarrer le serveur Mongrel pour recharger le plugin. Par contre
c'est dommage par dfaut, votre patch transform les espaces en %20.
Posted by Thibaut Barrère (thbar)
on 05.03.2008 09:27
(Received via mailing list)
Hello,

voici un patch possible :

http://pastie.caboo.se/161676

En pratique je l'injecte dans PermalinkFu (il ne fait que supprimer
les accents).

J'en profite: vu que les franais ont frquemment ce souci d'accents
dans les urls, je me dis que a pourrait tre intressant de publier
une bonne fois pour toute une gem ou un plugin rails pour grer a.
Qu'en pensez-vous ?

-- Thibaut
Posted by Renaud (Nel) Morvan (Guest)
on 05.03.2008 15:23
(Received via mailing list)
On 5 mar, 09:25, Thibaut Barrère <thibaut.barr...@gmail.com> wrote:
> dans les urls, je me dis que ça pourrait être intéressant de publier
> une bonne fois pour toute une gem ou un plugin rails pour gérer ça.
> Qu'en pensez-vous ?

J'aime bien je remarque juste que cette méthode a 2 petits defaults:

- elle est 4 fois plus lente qu'une methode à base de regex très
complète et sans doute encore pire pour une version à base de regexp
simple. Suivant l'usage qu'on en fait ca n'est pas forcement
dramatique
- les translitérations qu'elle supporte ne sont pas exhautive non plus
bien que loin d'être mauvaise. Pas de œ de ß .

Ca marche bien sur 'âäàãáäåāăąǎǟǡǻȁȃȧẵặ' ou
'òóôõōŏȯöỏőǒȍȏơǫọɵøồốỗổȱȫȭṍṏṑṓờớỡởợǭộǿ' et même 'ÇĆČĈĊ' en revanche.
Et c'est clair que c'est plus esthétique que gérer des tableau de
correspondance de caractère. Et évidemment c'est réservé exclusivement
aux langues occidendales.

Reste à espérer que la solution miracle viendra du coté de ruby 1.9
Posted by Thibaut Barrère (thbar)
on 05.03.2008 16:23
(Received via mailing list)
Salut Renaud!

> J'aime bien je remarque juste que cette mthode a 2 petits defaults:
>
> - elle est 4 fois plus lente qu'une methode  base de regex trs
> complte et sans doute encore pire pour une version  base de regexp
> simple. Suivant l'usage qu'on en fait ca n'est pas forcement
> dramatique
> - les translitrations qu'elle supporte ne sont pas exhautive non plus
> bien que loin d'tre mauvaise. Pas de OE de  .

Merci pour les retours!

En pratique je me sers de cette mthode lors de la cration d'articles
dans un CMS (la perf ne pose pas de problme dans mon cas, le facteur
limitant tant le rdacteur :-).

> Reste  esprer que la solution miracle viendra du cot de ruby 1.9

J'aimerais autant - car malgr tout a fait un peu bricolage!

-- Thibaut
Posted by Chris Gers32 (gers32)
on 06.03.2008 14:35
> Et �a marche plut�t bien (sans compter le nombre important de
> caract`eres pris en compte)
> 
> Bonne 
> journ�eFred

Bonjour,

J'ai voulu implémenter la fonction de Fred ci-dessous, mais 
l'interpréteur Ruby n'aime pas... les accents, justement !

  def remove_accents( str )

    accents = { ['á','à','â','ä','ã','Ã','Ä','Â','À'] => 'a',
                ['é','è','ê','ë','Ë','É','È','Ê'] => 'e',
                ['í','ì','î','ï','I','Î','Ì'] => 'i',
                ['ó','ò','ô','ö','õ','Õ','Ö','Ô','Ò'] => 'o',
                ['œ'] => 'oe',
                ['ß'] => 'ss',
                ['ú','ù','û','ü','U','Û','Ù'] => 'u'
    }
    accents.each do |ac,rep|
      ac.each do |s|
        str.gsub!(s, rep)
      end
    end
    return str

  end

Est-ce un problème dû à mon environnement de développement (Eclipse) ?

Merci,

Christophe.
Posted by Cyril Mougel (shingara)
on 06.03.2008 14:39
(Received via mailing list)
On Thu, Mar 6, 2008 at 2:35 PM, Chris Gers32
<list-incoming@andreas-s.net> wrote:
>  J'ai voulu implémenter la fonction de Fred ci-dessous, mais
>                 ['ß'] => 'ss',
>   end
>
>  Est-ce un problème dû à mon environnement de développement (Eclipse) ?
>

Ton fichier est-il bien encodé en UTF-8 justement ?

--
Cyril Mougel
http://blog.shingara.fr
Posted by Chris Gers32 (gers32)
on 06.03.2008 15:30
Aha ! Eh non, il ne l'était pas, justement... C'est maintenant chose 
faite.

Merci,

Christophe.
Posted by Renaud (Nel) Morvan (Guest)
on 06.03.2008 17:24
(Received via mailing list)
> J'ai voulu implmenter la fonction de Fred ci-dessous, mais
>                 ['','','','','U','',''] => 'u'
>     }
>     accents.each do |ac,rep|
>       ac.each do |s|
>         str.gsub!(s, rep)
>       end
>     end
>     return str
>
>   end
>

IMHO l'implmentation de cette mthode n'est pas optimale, au niveau
performance elle est a peu prs quivalente  la mthode de Thibault
avec un support de caractre bien moindre.

- La table de correspondance est redfinie  chaque execution, donc +
de GC et du temps perdu.
- Et il y a beaucoup trop d'itration, prcompiler un nombre limit de
regexp serait beaucoup plus performant et viterait que gsub le fasse
 chaque execution.

Si c'est execut une fois de temps en temps ca n'a pas d'importance
mais en cas d'utilisation intensive ca n'est pas terrible.
Posted by Chris Gers32 (gers32)
on 07.03.2008 09:24
Oui, je réalise que cette fonction n'est pas optimale, mais étant peu 
expérimenté en Ruby, c'était la solution la plus claire.

Mais de toute façon, elle ne marche pas dans mon cas : lorsque je fais 
tourner l'application dans le débogueur, je vois que Ruby ne reconnaît 
pas les caractères accentués reçus via une URL et les affiche comme des 
données binaires... Pourtant, ils semblent bien encodés dans l'URL ; la 
console affiche ceci :

Parameters: {... "description"=>"ÂÄéèÊËçîïÏÔü", "controller"=>...}

http://localhost/wrk_vpreparations/by_multi_criteria_xml?description=%C2%C4%E9%E8%CA%CB%E7%EE%EF%CF%D4%FC.......

SELECT DESC_FR FROM wrk_vpreparations WHERE (upper( desc_fr ) like 
'%ÂÄéèÊËçîïÏÔü%')

Donc on voit bien que toutes les lettres accentuées sont bien passées 
via l'URL, mais dans le SELECT, elles devraient avoir été converties en 
AAEEEECIIIOU (j'applique d'abord la fonction remove_accents(), puis 
upcase).

C'est bien au niveau de Ruby que ça déconne, parce que si j'essaie de 
faire un simple "é".upcase dans script/console (irb de RadRails), ça 
plante... En revanche, la même chose dans irb en ligne de commande 
renvoie "\202" ; je n'y comprends plus rien !