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...
on 03.03.2008 01:34
on 03.03.2008 08:00
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
on 03.03.2008 14:08
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 :
on 04.03.2008 16:18
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
on 04.03.2008 21:33
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.
on 04.03.2008 21:37
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.
on 05.03.2008 09:27
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
on 05.03.2008 15:23
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
on 05.03.2008 16:23
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
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.
on 06.03.2008 14:39
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
on 06.03.2008 15:30
Aha ! Eh non, il ne l'était pas, justement... C'est maintenant chose faite. Merci, Christophe.
on 06.03.2008 17:24
> 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.
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 !