Encodage caractère

Encodage caractère - Java - Programmation

Marsh Posté le 10-02-2011 à 16:31:12    

Salut,
 
J'ai le problème le plus classique qui soit: un problème d'encoding de caractères. Et pourtant, je n'arrive pas à comprendre où se produit l'erreur.
 
Ma JSP est encodée en UTF-8, elle contient un formulaire dans lequel je rentre des valeurs avec des accents.
 
l'en-tête du code HTML généré contient:

Code :
  1. <meta http-equiv="content-type" content="text/html; charset=utf-8" />


(vérifié avec ctrl+u sous Firefox)
 
Toujours sur Firefox, si je vais dans "Affichage -> Encodage des caractères", c'est bien UTF-8 qui est sélectionné/
 
Dans le formulaire, je rentre le mot "ajouté", puis je submit.
 
Avec firebug, je vois que le contenu envoyé (en post) est  
 

Code :
  1. regle.nom=ajout%C3%A9


 
Du coté du serveur d'application (un JBoss), un System.out.println de la variable me donne:

Code :
  1. ajouté


 
et dans la base de données, la valeur insérée est  

Code :
  1. ajouté


 
Par contre, si je force l'affichage de la page en ISO-8859-1 avant de soumettre le formulaire, les accents passent correctement.
 
Avez-vous une idée de là ou se situe le problème?
Pour l'instant, je trouve que "regle.nom=ajout%C3%A9" est correct (il me semble que l'encoding de "é" est bien "%C3%A9" en UTF-8, mais c'est comme si le serveur essayait de lire la valeur comme de l'ISO-8859-1...
Au passage, si quelqu'un connait bien JBoss et pouvait me dire s'il y a quelque chose à régler...
 
Note: j'utilise aussi le framework Struts²... peut-être qu'il y a aussi une couche là dedans...
 
Note: Non, je ne suis pas un frust&eacute; de l'encoding de caract&egrave;res

Reply

Marsh Posté le 10-02-2011 à 16:31:12   

Reply

Marsh Posté le 11-02-2011 à 12:18:57    

liouan a écrit :

Salut,
J'ai le problème le plus classique qui soit: un problème d'encoding de caractères. Et pourtant, je n'arrive pas à comprendre où se produit l'erreur.
...


 
Donc tu as un formulaire en unicode, un jboss en "on ne sait pas" et une base idem.
 
Si tu veux faire de la gestion de l'encoding (par exemple si tu veux gérer du grec ou de l'arabe),
la manière fiable c'est de gérer de bout en bout, gérer l'encodage à tous les niveaux.
Et un sgbd à un encodage ... on le régle à la création du sgbd .
Même java à un encodage, dès que tu fais un 'read', 'write' ... l'encodage par défaut est pris,
à moins que tu ne surcharges .
 
Si tu veux te limiter à un jeu de caractère 'francais', il faut que ta jsp soit en iso latin 1,
ton jboss soit en iso latin 1 (c'est la valeur par défaut) et ta base de données aussi
(et je parie que ta base de données est en iso latin 1 par défaut).
 
iso latin 1 : pour la france  
iso latin 6 : arabe
unicode : la plupart des alphabets de la planète
 
Si tu veux être compatible "multi alphabets", prens de l'uftf8,
- au niveau du jsp, tu as trouvé la balise qui va bien
- au niveau de jboss ... ajoutes cela dans le .sh ou .bat de démarrage  
  set JAVA_OPTS=-Dfile.encoding=UTF-8 %JAVA_OPTS%
- le sgbd doit être en utf-8 et elle ne l'est certainement pas.
  attention un sgbd en unicode prend plus d'espace disque (x2 environ)
 
Le but c'est :

  • tu vois la bonne chaine dans le formulaire jsp de création modification
  • la même chaîne dans le form jsp d'édition  
  • et surtout la même chaîne dans la table du sgbd

Si tu as cela, il y a des chances que tu sois blindé ...
   
Pour vérifier dans la base tes chaines de carac insérées,  
je recommande un client unicode, un client jdbc fait cela.
squirrel par exemple ...
 
L'étape suivante c'est de mettre des chaines utf-8 dans les fichiers properties :-)
Puisque tu vas apparememnt faire de l'utf-8
 
 
 
 

Reply

Marsh Posté le 11-02-2011 à 15:20:27    

Au niveau de la base de données, c'était bon. Elle était déjà réglée en UTF-8.
 
Par contre, au niveau JBoss, par défaut, il décode toutes les chaînes comme si elles étaient encodées en ISO-8859-1.
 
J'ai donc mis un filtre en première position, qui a pour seul but de régler correctement l'encoding dans le doFilter(...):
 
req.setCharacterEncoding("UTF-8" );
resp.setContentType("text/html;charset=UTF-8" );

Reply

Marsh Posté le 11-02-2011 à 15:52:08    

liouan a écrit :

Au niveau de la base de données, c'était bon. Elle était déjà réglée en UTF-8.
 
Par contre, au niveau JBoss, par défaut, il décode toutes les chaînes comme si elles étaient encodées en ISO-8859-1.
 
J'ai donc mis un filtre en première position, qui a pour seul but de régler correctement l'encoding dans le doFilter(...):
 
req.setCharacterEncoding("UTF-8" );
resp.setContentType("text/html;charset=UTF-8" );


 
Pour ma part j'ai fait un retour de mon expérience  JSP -> Struts -> Jboss 4 -> Informix. C'était il y a ... 4 ans.
 
La seule solution que j'avais trouvé était de changer l'encodage au niveau des paramètres java (le -D encoding)
et Jboss avait pris en compte.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed