Comment forcer le navigateur à définir le jeu de caractères dans l'en-tête HTTP content-type
Un fichier HTML simple:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<form method="POST" action="test.jsp" accept-charset="utf-8" method="post" enctype="application/x-www-form-urlencoded" >
<input type="text" name="P"/>
<input type="submit" value="subMit"/>
</form>
</body>
</html>
Le fichier HTML est servi par le serveur en utilisant l'en-tête Content-Type:text/html; charset=utf-8
. Tout le dit: "chers navigateur lorsque vous postez ce formulaire, s'il vous plaît poster codé en utf-8". Le navigateur en fait cela. Chaque valeur entrée dans le champ de saisie sera codé en UTF-8. MAIS le navigateur coutume de dire au serveur! L'en-tête HTTP de la requête post contiendra un Content-Type:application/x-www-form-urlencoded
champ, mais le jeu de caractères doit être omis (testé avec FF3.6 et IE8).
Le problème est le serveur d'applications que j'utilise (Tomcat6) s'attend à ce que le jeu de caractères dans l'entête Content-Type (comme indiqué dans RFC2388). Comme ceci: Content-Type:application/x-www-form-urlencoded;charset=utf-8
. Si le jeu de caractères est omise, elle assumera ISO-8859-1 qui n'est pas le jeu de caractères utilisé pour l'encodage. Le résultat est cassé données.
Fait un peu une idée de la façon de forcer les navigateurs actuels pour ajouter le jeu de caractères à l'entête Content-Type?
source d'informationauteur Eduard Wirch
Vous devez vous connecter pour publier un commentaire.
Non, aucun navigateur n'a jamais fourni un
charset
paramètre avec laapplication/x-www-form-urlencoded
type de média. De plus, la spécification HTML qui définit ce type, ce n'est pas de proposer uncharset
paramètre, le serveur ne peut pas raisonnablement s'attendre à obtenir un.(HTML4 ne s'attendre à une
charset
pour les sous-parties d'unmultipart/form-data
de la soumission, mais même dans ce cas, aucun navigateur fait conforme.)accept-charset
est cassé dans IE, et ne doit pas être utilisé. Il ne fera pas une différence de toute façon pour les formulaires dans les pages servi en tant que UTF-8, mais dans d'autres cas, il peut aboutir à des résultats incohérents.Pas, avec des formes, vous avez juste à servir la page qu'ils sont en tant que UTF-8, et les résultats devraient revenir en tant que UTF-8 (sans marques d'identification pour vous dire que (sauf, éventuellement, pour la
_charset_
hackmais Tomcat ne supporte pas que).De sorte que vous avez à dire le conteneur de Servlet ce que l'encodage à utiliser pour les paramètres si vous ne voulez pas qu'elle tombe de nouveau à sa valeur par défaut (ce qui est généralement mauvais). Dans certaines circonstances, vous pourriez être en mesure d'appeler
ServletRequest.setCharacterEncoding()
pour ce faire, mais cela a tendance à être cassant, et ne fonctionne pas du tout pour les paramètres de la chaîne de requête. Il n'y a pas un standard Servlet-niveau pour résoudre ce problème, malheureusement. Pour Tomcat, vous avez généralement à bricolons avec l'server.xml au lieu d'être en mesure de le réparer dans l'application.