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 2008-03-03 01:34
on 2008-03-03 08:00
Le 3 mars 08 à 01:34, Frioffol Friofool a écrit : > > 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... > -- 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 plutôt bien (sans compter le nombre important de caract`eres pris en compte) Bonne journéeFred
on 2008-03-03 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 2008-03-04 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 2008-03-04 21:33
Bonjour Thibaut, J'ai essayé d'implémenter votre code comme monkeypatch au plugin PermalinkFu, mais cela n'a pas fonctionné. L'avez-vous déjà 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 2008-03-04 21:37
Ha ben en fait je viens d'y arriver. J'avais oublié qu'il fallait redémarrer le serveur Mongrel pour recharger le plugin. Par contre c'est dommage par défaut, votre patch transform les espaces en %20.
on 2008-03-05 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 français ont fréquemment ce souci d'accents 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 ? -- Thibaut
on 2008-03-05 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 2008-03-05 16:23
Salut Renaud! > 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 OE de ß . Merci pour les retours! En pratique je me sers de cette méthode lors de la création d'articles dans un CMS (la perf ne pose pas de problème dans mon cas, le facteur limitant étant le rédacteur :-). > Reste à espérer que la solution miracle viendra du coté de ruby 1.9 J'aimerais autant - car malgré tout ça fait un peu bricolage! -- Thibaut
on 2008-03-06 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 2008-03-06 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 2008-03-06 15:30
Aha ! Eh non, il ne l'était pas, justement... C'est maintenant chose faite. Merci, Christophe.
on 2008-03-06 17:24
> J'ai voulu implémenter 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'implémentation de cette méthode n'est pas optimale, au niveau performance elle est a peu près équivalente à la méthode de Thibault avec un support de caractère bien moindre. - La table de correspondance est redéfinie à chaque execution, donc + de GC et du temps perdu. - Et il y a beaucoup trop d'itération, précompiler 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 2008-03-07 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 !
on 2009-02-19 09:13
Cela fait bientôt un an... J'ai été occupé à faire de la gestion de
projets, mais me re-voici avec le même problème :
Cette fois, j'ai fait la substitution dans irb et elle fonctionne :
C:\Users\Christophe>irb
irb(main):001:0> str = "éthanol"
=> "\202thanol"
irb(main):002:0> str.gsub('é', 'e')
=> "ethanol"
Quelqu'un peut-il m'expliquer pourquoi ça ne fonctionne pas dans la
méthode de Fred ci-dessous ? Comme je l'ai indiqué plus haut, mon
fichier source est bien encodé en UTF-8.
def ApplicationHelper.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
J'ai également essayé la méthode escape( str ) de Thibaud (au-dessus),
mais l'exécution de l'application semble s'interrompre (je n'ai sûrement
pas su m'en servir...).
Merci,
Christophe.
on 2009-02-19 10:48
J'ai défini une version "light" de la méthode dans irb ; elle fonctionne
:
irb(main):017:0> def remove_accents( str )
irb(main):018:1> accents = { ['é'] => 'e'}
irb(main):019:1> accents.each do |ac, rep|
irb(main):020:2* ac.each do |s|
irb(main):021:3* str.gsub!(s, rep)
irb(main):022:3> end
irb(main):023:2> end
irb(main):024:1> return str
irb(main):025:1> end
=> nil
irb(main):026:0> remove_accents( "éthanol" )
=> "ethanol"
Pourrait-il y avoir un paramétrage de l'encodage dans un fichier de
configuration quelque part ou au niveau d'Eclipse ?
Christophe.
on 2009-02-19 12:43
> irb(main):026:0> remove_accents( "éthanol" ) > => "ethanol" > > Pourrait-il y avoir un paramétrage de l'encodage dans un fichier de > configuration quelque part ou au niveau d'Eclipse ? > > Christophe. "à âéè".parameterize.to_s :-)
on 2009-02-19 17:10
Fernando Perez wrote: > >> irb(main):026:0> remove_accents( "éthanol" ) >> => "ethanol" >> >> Pourrait-il y avoir un paramétrage de l'encodage dans un fichier de >> configuration quelque part ou au niveau d'Eclipse ? >> >> Christophe. > > "à âéè".parameterize.to_s :-) Malheureusement, lorsque j'utilise la méthode parameterize, j'ai le message d'erreur suivant : NoMethodError (undefined method `normalize' for "�thanol":String): c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/inflector.rb:283:in `transliterate' c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/inflector.rb:262:in `parameterize' c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/core_ext/string/inflections.rb:106:in `parameterize' ... Alors que j'ai passé le paramètre "éthanol" qui s'est transformé en "%E9" dans l'URL provenant d'une application Flex tournant dans un plugin Flash. Et lorsque je passe simplement "ethanol", je n'ai pas l'erreur. On dirait bien que la transcodification du "%E9" en "é" a déconné, mais je ne sais pas à quel niveau.
on 2009-02-21 13:55
Hello, tu utilises activesupport 2.2.2, je crois que parameterize n'existait pas encore dans cette release. Je crois que tu as gagné le droit de te rabattre sur diacritics_fu (github.com/thbar/diacritics_fu/tree). -- Thibaut
on 2009-06-02 08:42
Thibaut Barrère wrote: > tu utilises activesupport 2.2.2, je crois que parameterize n'existait > pas encore dans cette release. > Bonjour Thibaut, Ca fait un bail, mais j'ai dû laisser tomber le développement pour faire de la gestion de projets... Je me suis donc remis au "vrai" travail et ai mis à jour mes gems, pour inclure activesupport 2.3.2 ; pourtant, lorsque j'essaie d'utiliser "parameterize", j'ai toujours un message d'erreur sur la non existence de la fonction "normalize". J'ai trouvé un post qui mentionnait le problème et recommandait de le résoudre avec un "$KCODE = 'u'" (Unicode). Malheureusement, ça ne change rien pour moi... Merci de vos suggestions, Christophe.
on 2009-06-02 09:09
Voici un exemple dans irb. Lorsque l'encodage n'est pas spécifié, la
fonction "normalize" n'est pas trouvée pour la chaîne de caractères "a b
c". Puis, lorsque je spécifie l'encodage (UTF8), ça fonctionne avec "a b
c", mais pas avec "é è ç à ". Or, les seuls encodages disponibles sont
"NONE", "UTF8" et deux encodages japonais "EUC" et "SJIS"...
irb(main):002:0> require 'active_support'
=> true
irb(main):003:0> "a b c".parameterize
NoMethodError: undefined method `normalize' for "a b c":String
from
c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/inflector.rb:292:in
`transliterate'
from
c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/inflector.rb:261:in
`parameterize'
from
c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/core_ext/string/inflections.rb:106:in
`parameterize'
from (irb):3
irb(main):004:0> $KCODE = 'u'
=> "u"
irb(main):005:0> "a b c".parameterize
=> #<ActiveSupport::Multibyte::Chars:0x40fc07c @wrapped_string="a-b-c">
irb(main):006:0> "é è ç à ".parameterize
NoMethodError: undefined method `normalize' for "\202 \212 \207
\205":String
from
c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/inflector.rb:292:in
`transliterate'
from
c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/inflector.rb:261:in
`parameterize'
from
c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/core_ext/string/inflections.rb:106:in
`parameterize'
from (irb):6
on 2009-06-02 09:29
Chris Gers32 a écrit : > from > => "u" > `parameterize' > from > c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/core_ext/string/inflections.rb:106:in > `parameterize' > from (irb):6 > As-tu le fichier : c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/chars.rb <http://api.rubyonrails.org/files/vendor/rails/activesupport/lib/active_support/multibyte/chars_rb.html> En effet, la méthode normalize(http://api.rubyonrails.org/classes/ActiveSupport/Multibyte/Chars.html#M000952) est dans ce fichier. Sinon peut-être un problème de Windows. Typiquement la méthode qui est appelé dans ton cas n'est appelé que quand Iconv ne fonctionne pas :( cf : http://github.com/rails/rails/blob/196f780e30fcece25e4d09c12f9b9f7374ebed29/activesupport/lib/active_support/inflector.rb#L293 -- Cyril Mougel http://blog.shingara.fr
on 2009-06-02 09:56
Cyril Mougel wrote: > En effet, la méthode > normalize(http://api.rubyonrails.org/classes/ActiveSupport/Multibyte/Chars.html#M000952) > est dans ce fichier. > > Sinon peut-être un problème de Windows. Typiquement la méthode qui est > appelé dans ton cas n'est appelé que quand Iconv ne fonctionne pas :( > Bonjour Cyril, La méthode "normalize" est bien définie dans le fichier que tu décris, mais elle ne semble pas fonctionner pour les caractères accentués. J'ai repris un exemple dudit fichier, pour illustrer le problème : irb(main):004:0> require 'active_support' => true irb(main):005:0> $KCODE = 'u' => "u" irb(main):006:0> "The Perfect String ".mb_chars.downcase.strip.normalize => #<ActiveSupport::Multibyte::Chars:0x40f117c @wrapped_string="the perfect string"> irb(main):007:0> "La Chaîne Parfaite".mb_chars.downcase.strip.normalize NoMethodError: undefined method `normalize' for "la cha\214ne parfaite":String from (irb):7 Et pour ce qui est de "iconv", les lettres accentuées sont carrément supprimées : Iconv.iconv('ascii//ignore//translit', 'utf-8', "éthanol").to_s retourne "thanol"...
on 2009-06-18 01:26
Attention, une chaîne avec accents tapé dans la ligne de commande de windows n'est pas traitée de la même manière qu'une même chaîne écrite dans un fichier par exemple (dans le détail je ne sais pas trop pourquoi, mais il vaut mieux le savoir quand on fait des essais). Exemples que j'ai pondu ce matin, et je viens de rajouter le KCODE qui fait que ça marche bien sous win aussi : http://gist.github.com/130606 Pas besoin de préciser le KCODE dans le contexte de rails, je pense qu'il le fait comme un grand.
on 2009-06-18 09:45
Qui dit fichier sous windows sans se préoccuper de l'encodage dit encodage CP1252 par défaut, et le CP ce n'est ni de l'UTF, ni de l'ISO, c'est leur vilaine norme pénible juste à eux pour être pas compatible. Michel Belleville 2009/6/18 AlSquire <alsquire@gmail.com>
on 2009-06-18 10:11
> le CP ce n'est ni de l'UTF, ni de l'ISO, c'est leur vilaine norme pénible juste à eux pour être pas compatible.
Le CP 1252 s'appuyait sur ce qui était disponible à ce moment là de la
standardisation, c'est à dire un draft ANSI, draft qui a ensuite été
amendé pour devenir le latin-1 qu'on connait aujourd'hui, incompatible
sur un certain nombre de points.
C'est toujours la même histoire, pour Microsoft, Google ou Mozilla: ou
bien ils font un pari avant que les drafts soient finalisés et ils
sortent des produits (win95, webkit ou autre), ou ils ne sortent pas
de produits et quelqu'un d'autre les sort à la place :)
-- Thibaut
on 2009-06-18 10:28
Non c'était bien l'ANSI quand il n'y avait que l'ANSI. Et puis il y a eu l'ISO (oups, loupé le changement de cap) et puis il y a eu l'UTF (carramba, encore raté). Moi je vois plutôt ça comme ça : il y a les gens qui sortent un bon produit à peu près fini une fois tous les 6-7 ans, avec quelques bugs qui nécessitent un service pack, ou deux, ou trois, et qui sortent beaucoup de merdes entre temps juste pour occuper l'espace, sans se préoccuper des standards, et très cher, et d'un autre côté il y a les autres, dont certains font des produits gratuits, open-source, puissants, évolutifs, modulables, et respectueux des standards. D'où l'absence de comparaison entre par exemple Microsoft et Google ou Mozilla. Dans les trois, il y en a un qui sera toujours loin derrière tant qu'il se conduira de la même façon. Michel Belleville 2009/6/18 Thibaut Barrère <thibaut.barrere@gmail.com>
on 2009-06-18 10:29
(bien entendu, quand je dis loin derrière, je parle de la qualité du produit, pas du fric accumulé) Michel Belleville 2009/6/18 Michel Belleville <michel.belleville@gmail.com>
on 2009-06-18 10:46
> qu'il se conduira de la même façon.
Houla - y'a du lourd pour de la flamewar :)
Je retourne à mon développement Silverlight IronRuby Google Wave Qui
Tourne Dans FireFox (tm).
-- Thibaut
on 2009-06-18 15:24
Au final, j'ai suivi les conseils trouvés ici http://www.dixis.com/?p=48
Plutôt que de convertir des caractères accentués en caractères non
accentués dans mon application Rails, je les ai finalement gardés et du
coup, mon problème principal était de passer des accents à une base
Oracle via une requête SQL. Les problèmes d'encodage ont été résolus
grâce à l'insertion du code suivant dans application_controller.rb :
class ApplicationController < ActionController::Base
...
...
before_filter :headers_iso
def headers_iso
# make sure the charset matches the default Oracle NLS setting
headers["content-type"]= "text/xml; charset=windows-1252"
end
end
Merci,
Christophe.
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.