Problèmes avec les accents


#1

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\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…)

  1. 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 !


#2

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…


#3

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

\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_


#4

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

\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:inload’
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:inload’
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:ineach’
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:inprocess’
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:inrun’
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:inrequire’
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:innew_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:ingem_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:inrequire’
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:inrequire’
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:inrequire’
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


#5

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_


#6

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 ???


#7

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…


#8

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.


#9

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 ?


#10

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


#11

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-collations/Jeux_et_Collations.pdf

olfhen a écrit :