Forum: Rails France Problèmes avec les accents

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
olfhen (Guest)
on 2008-11-26 17:02
(Received via mailing list)
Bonjour,

je rencontre plusieurs problèmes avec les accents. Mon appli est
entièrement en latin-1 (car la bdd est en latin1 et je ne peux pas en
changer).

- dans database.yml, j'ai bien encoding: latin9
- j'ai rajouté
   headers["Content-Type"] = "text/html; charset=iso-8859-1"
 dans tous mes headers
- tous mes fichiers sont en latin1

Avec tout ça, je gère bien les accents (affiche et insertion dans la
bdd OK)  à 2 exceptions près :

1)  lorsque j'ai certains accents (tous ne posent pas de pb) dans une
chaine de caractère que je passe à un link_to dans une view :
<%= link_to "Liste des universites", universites_path %>
j'ai le message d'erreur suivant :
compile error
app/views/home/index.html.erb:20: syntax error, unexpected $undefined,
expecting ')'
...ath ).to_s); _erbout.concat "\n</p>\n"
                              ^
app/views/home/index.html.erb:20: unterminated string meets end of
file
app/views/home/index.html.erb:20: syntax error, unexpected
tSTRING_END, expecting tSTRING_CONTENT or tREGEXP_END or tSTRING_DBEG
or tSTRING_DVAR

j'ai essayé de mettre $KCODE='NONE' ou $KCODE='ISO-8859-1' dans
enviroment.rb, mais ça ne change rien.
Ce sont les accents graves et circonflexes qui posent problème (les
accents aïgus passent bien...)

2) la fonction upcase() ne marche pas sur les lettres accentuées. J'ai
essayé de convertir en utf-8, de transformer en majuscules, puis de
reconvertir en latin1, mais ça ne marche pas :

  def nom_maj
    i = Iconv.new('ISO-8859-1', 'UTF-8')
    ir = Iconv.new('UTF-8', 'ISO-8859-1')

    nom_utf8 = ir.iconv(nom)
    nom_latin1 = i.iconv(nom_utf8.upcase)

    return nom_latin1
  end

Au pire, je peux supprimer les accents quand je passe en majuscule,
mais si je pouvais éviter ça...

Merci de toute piste pouvant m'aider !
olfhen (Guest)
on 2008-11-26 17:19
(Received via mailing list)
Petite précision, pour le pb des accents dans le link_to, si je mets
l'entité HTML, ça roule... mais s'il y avait plus simple (et plus
définitif) comme solution...
Jean-François Trân (Guest)
on 2008-11-26 18:00
(Received via mailing list)
Le 26 novembre 2008 16:02, olfhen a écrit :

> je rencontre plusieurs problèmes avec les accents. Mon appli est
> entièrement en latin-1 (car la bdd est en latin1 et je ne peux pas en
> changer).
>
> - dans database.yml, j'ai bien encoding: latin9
> - j'ai rajouté
>   headers["Content-Type"] = "text/html; charset=iso-8859-1"

Latin-1 ou Latin-9 ?

>  dans tous mes headers
> - tous mes fichiers sont en latin1

Latin-1 ou Latin-9 ?

(c'est proche mais pas complètement identique)

> Avec tout ça, je gère bien les accents (affiche et insertion dans la
> bdd OK)  à 2 exceptions près :
>
> 1)  lorsque j'ai certains accents (tous ne posent pas de pb) dans une
> chaine de caractère que je passe à un link_to dans une view :
> <%= link_to "Liste des universites", universites_path %>

Il n'y a pas d'accents : à moins que tu n'aies écrit "Liste des universités" ?

> j'ai le message d'erreur suivant :
> compile error
> app/views/home/index.html.erb:20: syntax error, unexpected $undefined,
> expecting ')'
> ...ath ).to_s); _erbout.concat "\n</p>\n"

S'il y a un problème de compilation, c'est que tu as un problème d'encodage
d'accent, du Latin-1 dans du UTF-8 ou le contraire. Es-tu sûr que
ton fichier est bien encodé ? Qu'utilises-tu comme éditeur/IDE ?

   -- Jean-François.

--
Rails Party à Paris dimanche 30 novembre !
Infos: http://rubyfrance.org/evenements/rails-party-2008/
Inscriptions: http://railsparty.ror.bearstech.com

http://twitter.com/underflow_
olfhen (Guest)
on 2008-11-26 23:54
(Received via mailing list)
Bonsoir,

On 26 nov, 16:59, "Jean-François Trân" <removed_email_address@domain.invalid> 
wrote:
> > je rencontre plusieurs problèmes avec les accents. Mon appli est
> > entièrement en latin-1 (car la bdd est en latin1 et je ne peux pas en
> > changer).
>
> > - dans database.yml, j'ai bien encoding: latin9
> > - j'ai rajouté
> >   headers["Content-Type"] = "text/html; charset=iso-8859-1"
>
> Latin-1 ou Latin-9 ?
> (c'est proche mais pas complètement identique)

Ma base est en latin9, mais tout le reste est en effet en latin1. Je
viens d'essayer
de passer le fichier qui pose problème en latin9, mais ça ne change
rien.

> > Avec tout ça, je gère bien les accents (affiche et insertion dans la
> > bdd OK)  à 2 exceptions près :
>
> > 1)  lorsque j'ai certains accents (tous ne posent pas de pb) dans une
> > chaine de caractère que je passe à un link_to dans une view :
> > <%= link_to "Liste des universites", universites_path %>
>
> Il n'y a pas d'accents : à moins que tu n'aies écrit "Liste des universités" ?

oui, oui, j'ai bien écrit "Liste des universités" (l'accent s'est
perdu en route...)

> > j'ai le message d'erreur suivant :
> > compile error
> > app/views/home/index.html.erb:20: syntax error, unexpected $undefined,
> > expecting ')'
> > ...ath ).to_s); _erbout.concat "\n</p>\n"
>
> S'il y a un problème de compilation, c'est que tu as un problème d'encodage
> d'accent, du Latin-1 dans du UTF-8 ou le contraire. Es-tu sûr que
> ton fichier est bien encodé ? Qu'utilises-tu comme éditeur/IDE ?

J'utilise Smultron. J'ai fixé l'encodage par défaut en latin1. Et je
viens de vérifier tous
mes fichiers  avec la commande 'file', elle me répond bien que mes
fichiers sont
soit en ISO-8859 soit en ASCII (pour ceux ne comportant pas d'accents)

L'impression que j'ai, c'est que ce sont les fichiers ruby qui sont en
utf-8 et qui digèrent
mal mes fichiers latin1...

J'ai eu un problème similaire dans un fichier dans config/
initializers, il comportait des accents
(les mois en français...). Le serveur refusait de démarrer avec les
erreurs suivantes :

=> Booting WEBrick...
/usr/pkg/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/active_support/
dependencies.rb:503:in `load':config/initializers/time_formats.rb:7:
syntax error, unexpected tCONSTANT, expecting ']' (SyntaxError)
        "Juillet", "Août", "Septembre", "Octobre", "Novembre",
"Décembre"]
                                     ^
config/initializers/time_formats.rb:7: syntax error, unexpected
tCONSTANT, expecting $end
        "Juillet", "Août", "Septembre", "Octobre", "Novembre",
"Décembre"]
                                                ^
        from /usr/pkg/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/
active_support/dependencies.rb:503:in `load'
        from /usr/pkg/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/
active_support/dependencies.rb:355:in `new_constants_in'
        from /usr/pkg/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/
active_support/dependencies.rb:503:in `load'
        from /usr/pkg/lib/ruby/gems/1.8/gems/rails-2.1.1/lib/
initializer.rb:484:in `load_application_initializers'
        from /usr/pkg/lib/ruby/gems/1.8/gems/rails-2.1.1/lib/
initializer.rb:483:in `each'
        from /usr/pkg/lib/ruby/gems/1.8/gems/rails-2.1.1/lib/
initializer.rb:483:in `load_application_initializers'
        from /usr/pkg/lib/ruby/gems/1.8/gems/rails-2.1.1/lib/
initializer.rb:149:in `process'
        from /usr/pkg/lib/ruby/gems/1.8/gems/rails-2.1.1/lib/
initializer.rb:97:in `send'
        from /usr/pkg/lib/ruby/gems/1.8/gems/rails-2.1.1/lib/
initializer.rb:97:in `run'
        from /home/www/rails/theses_lesia/config/environment.rb:13
        from /usr/pkg/lib/ruby/vendor_ruby/1.8/rubygems/
custom_require.rb:27:in `gem_original_require'
        from /usr/pkg/lib/ruby/vendor_ruby/1.8/rubygems/
custom_require.rb:27:in `require'
        from /usr/pkg/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/
active_support/dependencies.rb:510:in `require'
        from /usr/pkg/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/
active_support/dependencies.rb:355:in `new_constants_in'
        from /usr/pkg/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/
active_support/dependencies.rb:510:in `require'
        from /usr/pkg/lib/ruby/gems/1.8/gems/rails-2.1.1/lib/commands/
servers/webrick.rb:59
        from /usr/pkg/lib/ruby/vendor_ruby/1.8/rubygems/
custom_require.rb:27:in `gem_original_require'
        from /usr/pkg/lib/ruby/vendor_ruby/1.8/rubygems/
custom_require.rb:27:in `require'
        from /usr/pkg/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/
active_support/dependencies.rb:510:in `require'
        from /usr/pkg/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/
active_support/dependencies.rb:355:in `new_constants_in'
        from /usr/pkg/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/
active_support/dependencies.rb:510:in `require'
        from /usr/pkg/lib/ruby/gems/1.8/gems/rails-2.1.1/lib/commands/
server.rb:39
        from /usr/pkg/lib/ruby/vendor_ruby/1.8/rubygems/
custom_require.rb:27:in `gem_original_require'
        from /usr/pkg/lib/ruby/vendor_ruby/1.8/rubygems/
custom_require.rb:27:in `require'
        from ./script/server:3

J'ai dû convertir le fichier en UTF-8 et utiliser Iconv pour
transcrire. C'est le seul fichier UTF-8 de mon appli. Je viens
d'essayer de le remettre en latin1 (en enlevant les accents) pour
tester, mais ça ne change pas mon problème avec les link_to
olfhen (Guest)
on 2008-11-28 16:44
(Received via mailing list)
Bonjour,

je reviens sur mon problème avec un autre diagnostic. Il concerne les
chaînes de caractères contenant des accents comme paramètre de
fonctions telles que link_to. En fait, rails plante si l'accent est à
moins de 2 caractères de la fin de la chaîne.

Exemple :
<%= link_to "Liste des universités", universites_path %> plante
alors que
<%= link_to "Liste des universités ", universites_path %> ne plante
pas. Remarquer l'espace à la fin de la chaîne.

Autre exemple :
flash[:notice] =  "L'université #{@universite.display} a été
modifiée." plante
alors que
flash[:notice] =  "L'université  #{@universite.display} a été
modifiée." ne plante pas. Remarquer les 2 espaces entre le "é" de
université et le #{...}.
Enfin, dans ce cas, il n'y a pas plantage, mais la chaîne  #
{@universite.display} est rendue telle quelle et n'est pas
interprétée.

Il faut donc que je fasse attention à mettre des espaces là où
il
faut, mais c'est déjà moins contraignant que de devoir remplacer les
accents par des entités.

Quelqu'un aurait une explication ???
Jean-François Trân (Guest)
on 2008-11-28 16:59
(Received via mailing list)
Le 28 novembre 2008 15:43, olfhen a écrit :

> je reviens sur mon problème avec un autre diagnostic. Il
> concerne les chaînes de caractères contenant des accents
> comme paramètre de fonctions telles que link_to. En fait,
> rails plante si l'accent est à moins de 2 caractères de la fin
> de la chaîne.

Pour moi c'est toujours un problème d'encodage qui provoque
une erreur de syntaxe ou non, selon le code qui suit derrière.

Tu peux tester avec une vue très simplifié
<%= "universités" %>

et tu mets du code derrière pour l'aider à avoir un syntax
error.

un éditeur hexa pour vérifier les caractères accentués.

une appli Rails vierge avec aucun modèle, un contrôleur
réduit à sa plus simple expression (def hello; end)
et une vue avec "universités", éventuellement un link_to
pour aider à avoir une erreur de syntaxe.
Si tu reproduis l'erreur, on a déjà cerné un peu le pb.

   -- Jean-François.

--
Rails Party à Paris dimanche 30 novembre !
Infos: http://rubyfrance.org/evenements/rails-party-2008/
Inscriptions: http://railsparty.ror.bearstech.com

http://twitter.com/underflow_
Thomas B. (Guest)
on 2008-11-28 17:21
(Received via mailing list)
2008/11/28 olfhen <removed_email_address@domain.invalid>

> En fait, rails plante si l'accent est à moins de 2 caractères de la fin de
> la chaîne.


> Quelqu'un aurait une explication ???


Ruby interprète probablement tes caractères latin1/9 comme de l'utf8.
Comme
en utf8 les caractères non-ascii sont codés sur plusieurs octets, il
"saute"
des caractères et manque le guillemet de fin de chaine (ou le #{...}).

Il me semble qu'on peut spécifier l'encoding du fichier source, mais je
ne
me souvient plus comment.

Tu as une bonne raison de vouloir sortir tes pages en latin1 plutôt
qu'en
utf8 ?
olfhen (Guest)
on 2008-12-01 23:41
(Received via mailing list)
Bonsoir,

On 28 nov, 15:59, "Jean-François Trân" <removed_email_address@domain.invalid> 
wrote:
[...]
> Tu peux tester avec une vue très simplifié
> <%= "universités" %>
[...]
> une appli Rails vierge avec aucun modèle, un contrôleur
> réduit à sa plus simple expression (def hello; end)
> et une vue avec "universités", éventuellement un link_to
> pour aider à avoir une erreur de syntaxe.

J'ai suivi tes conseils. J'ai fait une appli rails toute neuve. je
mets exactement ce que j'ai fait :

- rails accents -d postgresql
- édition de config/database.yml pour y mettre les infos de connection
à la base
- édition de config/routes.rb pour y ajouter
  map.root :controller => "home"
- création d'un controller simple
  script/generate controller home index
- édition de la vue app/views/home/index.html.erb pour y mettre
uniquement :
  <%= "universités" %>

Voilà le contenu en hexa de la vue :
hexdump -C app/views/home/index.html.erb
00000000  3c 25 3d 20 22 75 6e 69  76 65 72 73 69 74 e9 73  |<%=
"universités|
00000010  22 20 25 3e 20 0a                                 |" %> .|
00000016

Le é de université est codé par e9, qui est bien la représentation en
latin1 du é.

Tel quel, rails plante avec ;
================================================================================
 SyntaxError in Home#index

Showing home/index.html.erb where line #1 raised:

compile error
app/views/home/index.html.erb:1: syntax error, unexpected $undefined,
expecting ')'
...s" ).to_s); _erbout.concat " \n"
                              ^
app/views/home/index.html.erb:1: unterminated string meets end of file
app/views/home/index.html.erb:1: syntax error, unexpected $end,
expecting ')'

Extracted source (around line #1):

1: <%= "universit�s" %>

Trace of template inclusion: /home/index.html.erb
================================================================================

Si je rajoute un espace à la fin de universités, voici ce que contient
index.html.erb :
<%= "universités " %>
et en hexa :
00000000  3c 25 3d 20 22 75 6e 69  76 65 72 73 69 74 e9 73  |<%=
"universités|
00000010  20 22 20 25 3e 20 0a                              | " %> .|
00000017

Là, aucune erreur de rails, qui m'affiche :
universit�s
Je n'ai pas touché au Content-type, c'est pour ça que j'ai un � au
lieu du é, par contre, si je demande explicitement à mon navigateur de
m'afficher du iso8859-1, j'ai bien
universités

Si je convertis mon fichier en utf-8 (sans l'espace à la fin de
universités) :
mv index.html.erb index.html.erb-latin1
iconv -f ISO_8859-1 -t UTF-8 index.html.erb > index.html.erb
Voilà le contenu en hexa :
00000000  3c 25 3d 20 22 75 6e 69  76 65 72 73 69 74 c3 a9  |<%=
"université|
00000010  73 22 20 25 3e 20 0a                              |s" %> .|
00000017

Là, aucune erreur non plus, et rails m'affiche :
universités
(avec l'accent correct)

Je dois avouer que même si j'arrive à reproduire le problème, je ne le
comprends pas d'avantage....
olfhen (Guest)
on 2008-12-01 23:47
(Received via mailing list)
On 28 nov, 16:20, "Thomas B." <removed_email_address@domain.invalid> wrote:
> 2008/11/28 olfhen <removed_email_address@domain.invalid>
>
> > En fait, rails plante si l'accent est à moins de 2 caractères de la fin de
> > la chaîne.
> > Quelqu'un aurait une explication ???
>
> Ruby interprète probablement tes caractères latin1/9 comme de l'utf8. Comme
> en utf8 les caractères non-ascii sont codés sur plusieurs octets, il "saute"
> des caractères et manque le guillemet de fin de chaine (ou le #{...}).

Visiblement...

> Il me semble qu'on peut spécifier l'encoding du fichier source, mais je ne
> me souvient plus comment.

J'ai essayé de spécifie $KCODE = 'NONE' ou $KCODE = 'ISO-8859-1' dans
environment.db, mais sans aucun succès.

> Tu as une bonne raison de vouloir sortir tes pages en latin1 plutôt qu'en
> utf8 ?

Oui, ma base de données est en latin1, et je ne peux pas changer son
encodage... J'ai essayé de passer tous mes fichiers en utf-8, mais
malgré le encoding: latin9 (ou encoding: latin1) dans config/
database.yml, les accents ne sont pas correctement encodés dans la
base.
Christian L. (Guest)
on 2008-12-02 00:33
(Received via mailing list)
> Il me semble qu'on peut spécifier l'encoding du fichier source,
> mais je ne me souvient plus comment.

Tout simplement avec un commentaire en haut du fichier, par exemple :

# encoding: utf-8

Christian
Sébastien Lamy (Guest)
on 2008-12-02 14:50
(Received via mailing list)
Peut-être peux-tu aussi travailler avec une appli en UTF8 et une base en
latin9.
Pour ça il faut voir du coté du paramétrage de ta connection à la base
(jeux et collations de la requête du résultat, et de la connection je
crois).
Un pdf qui m'avait bien aidé, si ta base est en mysql
http://antoun.developpez.com/mysql5/jeux-collation...

olfhen a écrit :
This topic is locked and can not be replied to.