2010-05-05 4 views
1

J'ai une page HTML qui ressemble à:Puis-je envoyer un formulaire POST dans un encodage autre que celui de son corps?

<HTML> 
<meta http-equiv='Content-Type' content='text/html; charset=gb2312'> 
<BODY onload='document.forms[0].submit();'> 
<form name="form" method="post" action="/path/to/some/servlet"> 
<input type="hidden" name="username" value="麗安"> <!-- UTF-8 characters --> 
</form> 
</BODY> 
</HTML> 

Comme vous pouvez le voir, le contenu de cette page est UTF-8, mais je dois l'envoyer avec un caractère GB2312 encodage, comme le servlet que je suis envoyer cette page à attend de moi GB2312.

Est-ce un scénario valide? Parce que dans le servlet, je ne pouvais pas récupérer ces caractères chinois en utilisant un filtre qui définit le codage de caractères à GB2312!

J'ai créé un échantillon Servlet:

package org.daz; 

import java.io.IOException; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class EncodingServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 
    private static final String ENCODING = "GB2312"; 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 

     setCharacterEncoding(request, response); 

     String username = request.getParameter("username"); 
     System.out.println(username); 

    } 

    private void setCharacterEncoding(HttpServletRequest request, HttpServletResponse response)throws IOException{ 
     request.setCharacterEncoding(ENCODING); 
     response.setCharacterEncoding(ENCODING); 
    } 

} 

La sortie est: 楹��

Répondre

1

Ceci n'est pas possible. Vous devrez utiliser les caractères GB2312 depuis le début, ou changer l'application entière pour utiliser UTF-8 uniquement. Vous ne pouvez pas convertir de l'encodage de caractères X à l'encodage de caractères Y de cette façon. Tout caractère en dehors de la plage ASCII pourrait être corrompu.

L'attribut accept-charset du formulaire est parfois ignoré par la plupart des navigateurs Web. Le W3 spec indique également littéralement "Les agents utilisateurs peuvent interpréter ..", pas "doit". Et même alors, il ne serait utilisé que pour encoder la réelle entrée utilisateur, pas les champs cachés comme dans votre exemple. Ils sont déjà codés dans le codage de la page (dans ce cas, GB2312). En d'autres termes, ces caractères UTF-8 sont déjà corrompu au moment où la page a été traitée par le navigateur.

+0

Merci trop, j'ai commenté cette conclusion sur mon blog: http://m-hewedy.blogspot.com/2010/05/beware-your-text-editor-encodes-your.html –

+0

De rien. Mon surnom est d'ailleurs ** BalusC **, pas * BlueC *;) – BalusC

+0

Oh, vous pouvez trouver [cet article] (http://balusc.blogspot.com/2009/05/unicode-how-to-get -characters-right.html) utile pour mieux comprendre le monde des caractères et des octets. – BalusC

1

Vous pouvez essayer de le faire,

<form name="form" method="post" action="/path/to/some/servlet" charset="gb2312" accept-encoding="gb2312"> 
<input type="hidden" name="username" value="麗安"> <!-- UTF-8 characters --> 
</form> 

Il pourrait fonctionner sur certains navigateurs. Cependant, le navigateur n'est pas nécessaire pour prendre en charge le GB2312, ce qui signifie que votre kilométrage peut varier.

+0

J'ai essayé sur Firefox et Chrome, et semble ne fonctionne pas pour moi! –

+0

Cela dépend aussi du système d'exploitation. Cela fonctionne pour moi sur IE6 sur Windows XP chinois. –

Questions connexes