2010-05-28 21 views
1

J'ai une application web (bien, en fait est juste un servlet) qui reçoit des données de 3 sources différentes:Servlet recevant des données à la fois dans ISO-8859-1 et UTF-8. Comment URL-décoder?

  • Source A est un document HTML écrit en UTF-8, et envoie les données via <form method="get"> . La source B est écrite en ISO-8859-1 et envoie également les données via <form method="get">. La source C est écrite en ISO-8859-1 et envoie les données via <a href="http://my-servlet-url?param=value&param2=value2&etc">.

La servlet reçoit les paramètres de requête et les décode en utilisant UTF-8. Comme vous pouvez vous y attendre, A fonctionne sans problèmes, tandis que B et C échouent (vous ne pouvez pas décoder l'URL en UTF-8 quelque chose qui est codé en ISO-8859-1 ...).

Je peux apporter de légères modifications à B et C, mais je ne suis pas autorisé à les changer d'ISO-8859-1 à UTF-8, ce qui résoudrait tous les problèmes. En B, j'ai pu résoudre le problème en ajoutant accept-charset="UTF-8" au <form> Il envoie donc les données en UTF-8 même si la page est ISO.

Que puis-je faire pour réparer C?

Sinon, est-il possible de déterminer le jeu de caractères sur le servlet, afin que je puisse appeler URL-decode avec le bon codage dans chaque cas?


Modifier: Je viens de trouver this, qui semble résoudre mon problème. Je dois encore faire quelques tests afin de déterminer si cela influe sur la performance, mais je pense que je m'en tiendrai à cette solution.

+0

Que diriez-vous de ' '? – zildjohn01

+0

Hmmm .. Je préférerais ne pas ajouter plus de paramètres à la demande ... mais je suppose que ça devrait marcher. Je vais l'essayer. Merci! :) – AJPerez

+0

Dans cette approche, je pense que la page de recherche principale de Google inclut (ou inclus) un paramètre "ie" ... Trop paresseux pour le tester maintenant http://www.seomoz.org/ugc/the-ultimate-guide -to-the-google-search-parameters – leonbloy

Répondre

0

Je me répondre afin de marquer la question comme résolue:

J'ai trouvé this question, qui couvre exactement le même problème que je faisais face. Le javax.servlet.Filter était la solution pour moi.

3

Le navigateur enverra par défaut les données dans le même encodage que la page demandée a été retournée. Ceci est contrôlable par l'en-tête HTTP Content-Type que vous pouvez également définir en utilisant la balise HTML <meta>.

L'attribut accept-charset de l'élément HTML <form> devrait être évité car il est cassé dans MSIE. Presque tous les encodages non-UTF-8 sont ignorés et seront envoyés dans l'encodage par défaut de la plate-forme (qui est généralement CP-1252 dans le cas de Windows).

Pour corriger A et B (POST), vous devez définir HttpServletRequest#setCharacterEncoding() avant de rassembler les paramètres de demande. Gardez à l'esprit que c'est une tâche ponctuelle. Vous ne pouvez pas obtenir un paramètre, puis modifier l'encodage et "récupérer" les paramètres.

Pour fixer C (GET), vous devez définir l'encodage URI de la requête dans la configuration du serveur. Comme il est difficile de savoir quel serveur vous utilisez, voici un exemple ciblé Tomcat: dans le HTTP connector définir l'attribut suivant:

<Connector (...) URIEncoding="ISO-8859-1" /> 

Cependant, ce qui est déjà l'encodage par défaut dans la plupart des serveurs. Donc, vous n'avez peut-être rien à faire pour C.

Comme alternative, vous pouvez saisir les données brutes et non codées dans URL du corps de la demande (en cas de POST) par HttpServletRequest#getInputStream() ou de la chaîne de requête (en cas de GET) par HttpServletRequest#getQueryString() puis estimation le codage vous-même en fonction des caractères disponibles dans les paramètres, puis URL-encode en utilisant le codage deviné. Un élément d'entrée caché avec un caractère spécifique qui est différent à la fois dans UTF-8 et ISO-8859-1 peut aider beaucoup dans ce domaine.

+0

Etes-vous sûr que 'accept-encoding' ne fonctionne que dans MSIE? Ma page ISO-8859-1 envoie maintenant les données correctement en UTF-8 (essayé dans Chrome et Firefox). Le problème auquel je suis confronté est que je ne sais pas quel codage est utilisé dans chaque cas, ISO-8859-1 ou UTF-8. Donc je ne peux pas utiliser 'setCharacterEncoding()'. J'espère que la suggestion de zildjohn01 aidera à le déterminer. – AJPerez