Bonjour,
Je sais que le sujet a été abordés maintes fois, mais là je m’en sort
pas
malgré tous les posts lus sur le sujet :
-
ma base MySql est en ISO 8859-1 (Latin 1)
-
mes fichier de code sont écrits en ISO-8859-15
-
mon site rails dispense de l’ISO 8859-15 grace à un set_charset qui va
bien dans l’application.rb, le voici :
def set_charset
content_type = @headers[“Content-Type”] || ‘text/html’
if /^text//.match(content_type)
@headers[“Content-Type”] = “#{content_type}; charset=ISO-8859-15”
end
end
Jusque là tout va bien, les données insérées depuis des applications
tierces
sont correctement affichées (avé les accents), mes accents présents en
dur
dans les fichiers de code du site apparaissent correctement.
Mon problème survient lorsque je veux insérer ou rechercher des données
depuis un formulaire de mon site en rails. Là , les caractères sont
semble-t-il encodés en UTF-8 lors du post du formulaire.
Est-ce que cela vient de l’encodage des libs activerecord et autres ? Si
oui, y’a-t-il un moyen simple de les convertir ? Est-ce que cela vient
de la
config du serveur web (ça me le fait avec apache et webrick sous linux)
?
Est-ce que j’aurais loupé un truc dans tous les posts qui traitent du
sujet
?
Merci de votre aide
Samuel
Samuel DECHOMETS wrote:
Mon problème survient lorsque je veux insérer ou rechercher des données
depuis un formulaire de mon site en rails. Là , les caractères sont
semble-t-il encodés en UTF-8 lors du post du formulaire.
Est-ce que cela vient de l’encodage des libs activerecord et autres ? Si
oui, y’a-t-il un moyen simple de les convertir ? Est-ce que cela vient
de la
config du serveur web (ça me le fait avec apache et webrick sous linux)
?
Par defaut, les serveurs web, Rails, ainsi que les navigateurs, encodent
en ISO latin 1.
Je suppose que tu appelle ton set_charset dans un before_filter, non ?
Si c’est le cas, il faudrait vérifier que l’entête HTTP est bien envoyé
(grâce à l’extension webdeveloper de FF, ou LiveHTTPHeaders, ou Firebug
aussi maintenent je crois). Tu peux aussi vérifier que tu n’as pas une
balise meta content-type incorrecte, bien qu’en théorique, celle-ci est
écrasée par le content-type HTTP réél.
Le navigateur devrait encoder le contenu des formulaires selon
l’encodage de la page qui contient le formulaire.
Personnellement, je préfère tout encoder en UTF-8, de bout en bout, pour
profiter des charactères typograhiques avancés.
Samuel DECHOMETS wrote:
Mon problème survient lorsque je veux insérer ou rechercher des données
depuis un formulaire de mon site en rails. Là , les caractères sont
semble-t-il encodés en UTF-8 lors du post du formulaire.
Je suppose que tu veux parler d’appels Ajax ? Dans ce cas, oui, les
réponses sont doivent forcément être encodées en UTF-8 - En clair, si tu
as un partial encodé avec un autre charset ça va foirer s’il est utilisé
dans un appel Ajax. J’ai été confronté à ce problème il y a quelques
mois et depuis j’utilise de l’UTF-8 de bout en bout…
Et je ne sais pas qui est la cause de ce bazar : rails ou prototype ?
Samuel :
@headers["Content-Type"] = "#{content_type}; charset=ISO-8859-15"
Est-ce que cela vient de l’encodage des libs activerecord et autres ? Si
oui, y’a-t-il un moyen simple de les convertir ? Est-ce que cela vient de la
config du serveur web (ça me le fait avec apache et webrick sous linux) ?
Est-ce que j’aurais loupé un truc dans tous les posts qui traitent du sujet
?
[Insérez la réponse ici]
Il s’agit en effet d’un problème d’ajax (cf.post de Nuno). J’avais omis
de
vous dire que mes forms étaient postés en ajax (omission de taille).
Pour
Ned, moi aussi j’aurais préféré tout faire en UTF-8, malheureusement,
dans
ce cas ce n’est pas possible car la base n’est pas remplie par mes
soins,
mais par un partenaire qui utilise de l’ISO-8859.
J’ai trouvé la solution depuis : malgré les entêtes en ISO-8859, les
requetes xhr encodent en UTF-8. Voici le bout de code qui permet de
convertir les données postées :
before_filter :convert_xhr
ICONV = Iconv.new(‘ISO-8859-1’, ‘UTF-8’)
def convert_xhr
convert_hash(params) if request.xhr?
end
def convert_hash(hash)
for k, v in hash
case v when String: hash[k] = ICONV.iconv(v) when Array: hash[k] =
v.collect { |v| ICONV.iconv(v) } when Hash: convert_hash(v) end
end
end
Voila, en espérant que ce post passe partout …(cf. “fonctionnement de
la
liste”)
Une question bete : est-ce que t’utilises des formulaires simples ou des
formulaires AJAX (form_remote) ?
Voila ce que je rajoute dans toutes mes applications pour etre sur que
tout passe en ISO, y compris les appels AJAX :
require ‘iconv’
class ApplicationController < ActionController::Base
after_filter :set_charset
before_filter :convert_xhr
ICONV = Iconv.new(‘ISO-8859-1’, ‘UTF-8’)
def convert_xhr
convert_hash(params) if request.xhr?
end
def convert_hash(hash)
for k, v in hash
case v
when String: hash[k] = ICONV.iconv(v)
when Array: hash[k] = v.collect { |v| ICONV.iconv(v) }
when Hash: convert_hash(v)
end
end
end
def set_charset
content_type = @headers[“Content-Type”] || ‘text/html’
if /^text//.match(content_type)
@headers[“Content-Type”] = “#{content_type}; charset=iso-8859-1”
end
end
end
Samuel DECHOMETS wrote:
Bonjour,
Je sais que le sujet a été abordés maintes fois, mais là je m’en sort
pas
malgré tous les posts lus sur le sujet :
-
ma base MySql est en ISO 8859-1 (Latin 1)
-
mes fichier de code sont écrits en ISO-8859-15
-
mon site rails dispense de l’ISO 8859-15 grace à un set_charset qui va
bien dans l’application.rb, le voici :
def set_charset
content_type = @headers[“Content-Type”] || ‘text/html’
if /^text//.match(content_type)
@headers[“Content-Type”] = “#{content_type}; charset=ISO-8859-15”
end
end
Jusque là tout va bien, les données insérées depuis des applications
tierces
sont correctement affichées (avé les accents), mes accents présents en
dur
dans les fichiers de code du site apparaissent correctement.
Mon problème survient lorsque je veux insérer ou rechercher des données
depuis un formulaire de mon site en rails. Là , les caractères sont
semble-t-il encodés en UTF-8 lors du post du formulaire.
Est-ce que cela vient de l’encodage des libs activerecord et autres ? Si
oui, y’a-t-il un moyen simple de les convertir ? Est-ce que cela vient
de la
config du serveur web (ça me le fait avec apache et webrick sous linux)
?
Est-ce que j’aurais loupé un truc dans tous les posts qui traitent du
sujet
?
Merci de votre aide
Samuel