Caractères accentués avec Rails


#1

Bonjour à tous,

Je sais que le problème des caractères accentués est souvent abordés,
mais même en cherchant sur les forums et google, je n’ai pas trouvé de
réponse à mon problème, et j’avoue même que je ne suis pas certaine de
le comprendre encore…

J’ai un site perso développé sous Ruby (1.8.6) on Rails (2.0.2) qui
fonctionne grosso modo comme un blog. Jusque là tout allait bien. Je
n’ai pour l’instant jamais eu à me plaindre pour les textes, tout
s’affiche correctement, en particulier les accents.

En ce moment, j’essaie de faire une méthode pour convertir les titres de
mes articles en chaine de caractères sans accents (typiquement pour
mettre en place l’url rewriting). C’est là que ça se gâte.

Lorsque, dans mon application helper, j’essaie de faire une méthode qui
remplace les éèê par des e, par exemple, j’obtiens une page d’erreur, ou
tous les caractères accentués sont remplacés par des “?”.
Après verif, mon fichier était encodé en ANSI, j’ai donc converti le
tout en UTF-8.

Je me retrouve avec le message :
undefined local variable or method `’ for main:Object

Je n’ai rien changé au fichier (d’ailleurs même si je supprime toutes
les méthodes qu’il contient, ça plante toujours), c’est vraiment changer
l’encodage qui lève l’erreur.

Pourriez-vous m’aider ?
Je ne suis pas experte en Ruby et là je désespère.


#2

Dans les dernières versions de Rails, la fonction parameterize est
tiiptop !
http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/String/Inflections.html#M001053

2009/1/29 Lily B. removed_email_address@domain.invalid


#3

Voici un bout de code que j’utilise avec succès pour convertir les
caratères
diacritiques (sans introduire de dépendance gem ou plugin) ; peut-être
te
sera-t-il utile

N.B. ce code convertit les espaces, apostrophes et traits d’union en “_”
;
si ce n’est pas souhaité il suffit de virer ce qui copncerne RGX_HYPHEN,
RGX_APOS et RGX_SPACES et ça devrait convenir

RGX_A  = /[áà ãåäÁÀÂÃÅÄ]/
RGX_C  = /[çÇ]/
RGX_D  = /[ðÐ]/
RGX_E  = /[éêèëÉÊÈË]/
RGX_I  = /[íìîïÍÌÎÏ]/
RGX_N  = /[ñÑ]/
RGX_O  = /[óòôõöøÓÒÔÕÖØ]/
RGX_S  = /[Å¡Å ]/
RGX_SS = /[ß]/
RGX_U  = /[úùûüÚÙÛÜ]/
RGX_Y  = /[ýÿÝ]/
RGX_AE = /[Ææ]/
RGX_OE = /[Å“Å’]/

RGX_HYPHEN  = /\s*\-\s*/
RGX_SPACES  = /\s+/
RGX_APOS    = /\s*(\'|\`)\s*/
RGX_ALPHA   = /[a-zA-Z]/
RGX_DEFAULT = 

Regexp.new("#{RGX_HYPHEN}|#{RGX_APOS}|#{RGX_SPACES}|.")
# \s*-\s*|\s*\’\s*|\s+

def canonicalize_default( text, country, lang )
  canon = text.strip.gsub( RGX_DEFAULT ) do |match|
    case match
    when RGX_A  then 'A'
    when RGX_C  then 'C'
    when RGX_D  then 'D'
    when RGX_E  then 'E'
    when RGX_I  then 'I'
    when RGX_N  then 'N'
    when RGX_O  then 'O'
    when RGX_S  then 'S'
    when RGX_SS then 'SS'
    when RGX_U  then 'U'
    when RGX_Y  then 'Y'
    when RGX_AE then 'AE'
    when RGX_OE then 'OE'
    when RGX_HYPHEN   then '_'
    when RGX_SPACES   then '_'
    when RGX_APOS     then '_' # TODO : look closer ???
    when RGX_ALPHA    then match
    end
  end

  canon.gsub!( /^_+/ , '' )  # Virer aussi
  canon.gsub!( /_+$/ , '' )   # si
  canon.upcase!                  # pas souhaité
  return canon
end

#4

J’utilise ce bout de code trouvé sur le web, placé dans un fichier
config/initializers/string_extensions.rb :

require ‘iconv’
class String

Iconv use borrowed from

http://svn.robertrevans.com/plugins/Permalize/

Thanks!

def to_permalink
(Iconv.new(‘US-ASCII//TRANSLIT’, ‘utf-8’).iconv
self).gsub(/[^\w\s-\â€"]/,’’).gsub(/[^\w]|[_]/,’
‘).split.join(’-’).downcase
end
end

L’utilisation est très simple : @article.title_to_permalink

2009/1/29 philippe lachaise removed_email_address@domain.invalid


#5

correction : @article.title.to_permalink


#6

Le 29 janv. 09 à 00:16, Lily B. a écrit :

En ce moment, j’essaie de faire une méthode pour convertir les
titres de
mes articles en chaine de caractères sans accents (typiquement pour
mettre en place l’url rewriting). C’est là que ça se gâte.

Tu peux voir du côté de acts_as_nice_url
(http://bitbucket.org/Bounga/acts_as_nice_url/
) , par contre prend bien la version 1.0.0 du gem.

Je me retrouve avec le message :
undefined local variable or method `’ for main:Object

Je n’ai rien changé au fichier (d’ailleurs même si je supprime toutes
les méthodes qu’il contient, ça plante toujours), c’est vraiment
changer
l’encodage qui lève l’erreur.

En ce qui concerne le passage de ton fichier de ISO à UTF8, ça peu te
poser le genre de problème que tu évoques. Ton fichier est long ? Si
non, tu peux toujours essayer de le ré-écrire au cas où un problème se
serait produit à la conversion de jeu de caractères.


Nicolas C.
http://www.bounga.org
http://www.cavigneaux.net


#7

Merci pour toutes vos réponses.

En fait à priori l’éditeur que j’utilise (Notepad++) a quelques soucis
avec l’utf8, même quand on lui demande expressément d’encoder comme ça.

Un ami m’a proposé de tester sous Scite et comme de par hasard, ça
fonctionne…

Merci Philippe pour ton code, je pensais faire quelque chose comme ça
mais vu que le tien est bien complet, je pense que je vais largement
m’en inspirer.

Une question : mon ami me dit que les regex ne sont pas en unicode dans
Rails, et qu’il faut donc ajouter un u à la fin de la regex (type :
/éèëê/u).

Qu’en pensez-vous ?


#8

les regex ne sont pas en unicode dans Rails … ajouter un u à la fin de
la regex

Euh, à priori ça marche comme ça, mais peut-être ai-je eu de la chance
jusqu’ici ?!

A vérifier …


#9

Le 29 janv. 09 à 17:07, Lily B. a écrit :

Une question : mon ami me dit que les regex ne sont pas en unicode
dans
Rails, et qu’il faut donc ajouter un u à la fin de la regex (type :
/éèëê/u).

Qu’en pensez-vous ?

Dans Rails $KCODE est à ‘u’ donc à priori ça suffit.

Nicolas C.
http://www.bounga.org
http://www.cavigneaux.net


#10

Ok merci beaucoup !


#11

En fait c’est transliterate qui est appelé par parameterize
http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#M000765
Vincent