8
votes

Pourquoi le caractère est corrompu lors de l'utilisation de request.geparameter () en Java?

J'ai un tel lien dans la page JSP avec codage BIG5 http: // bonjour / monde? Nom = 婀ㄉ Et quand je l'ai saisi dans la barre d'URL du navigateur, il sera changé à quelque chose comme http: // bonjour / monde? Nom =% 23% 24% 23 Et lorsque nous voulons obtenir ce paramètre dans la page JSP, tous les caractères sont corrompus.

Et nous avons mis ceci: demande.setcharacterencoding ("utf-8"), de sorte que toutes les demandes seront converties en UTF8.

Mais pourquoi dans ce cas, cela ne fonctionne pas? Merci d'avance!.


0 commentaires

5 Réponses :


6
votes

Vous ne pouvez pas avoir de caractères non-ASCII dans une URL - vous avez toujours besoin de les coder pourcentage. Ce faisant, les navigateurs ont des difficultés les rendant. Le rendu fonctionne mieux si vous encodez l'URL dans UTF-8, puis pourcentage-l'encoder. Pour votre URL spécifique, cela donnerait http: // Bonjour / Monde? Nom =% E5% A9% 80% E3% 84% 89 (vérifiez votre navigateur ce qu'il donne pour ce lien spécifique). Lorsque vous obtenez le paramètre JSP, vous devez explicitement l'absorber, puis le décoder à partir de UTF-8, car le navigateur l'enverra tel.


1 commentaires

Mais comment puis-je le coder? Changez-le de non-ASCII en pourcentage-Encode? Quelle fonction dois-je utiliser en Java?



14
votes

Lorsque vous entrez dans l'URL dans la barre d'adresse du navigateur, le navigateur peut convertir le codage du caractère avant l'encodage de l'URL. Cependant, ce comportement n'est pas bien défini, voir ma question,

personnage de manutention Encodage dans URI sur Tomcat P>

Nous obtenons principalement UTF-8 et Latin-1 sur les nouveaux navigateurs, mais nous obtenons toutes sortes de codages (y compris BIG5) chez les anciens. Il est donc préférable d'éviter les caractères non-ASCII dans l'URL entrées par l'utilisateur directement par l'utilisateur. P>

Si l'URL est intégrée dans JSP, vous pouvez le forcer à l'UTF-8 en le générant comme celui-ci, P> xxx pré>

sur tomcat, le codage doit être spécifié sur connecteur comme celui-ci, P>

<Connector port="8080" URIEncoding="UTF-8"/>


0 commentaires

8
votes

Pour éviter de violer avec le serveur.xml Utiliser: xxx

pour obtenir ces paramètres sur tomcat Vous devez faire quelque chose comme : xxx

comme apparemment (?) demande.getparameter urldecodes () la chaîne et interprète comme iso-8859-1 - ou quel que soit l'urience est défini sur dans le server.xml . Pour un exemple de comment obtenir le urancoding Charset à partir du server.xml pour tomcat 7 Voir ici


2 commentaires

Comment changer le codage par défaut pour le getParameter ?


@emab: à partir du server.xml comme détaillé dans les autres réponses



0
votes

J'ai eu un problème avec JBoss 7.0, et je pense que cette solution de filtre fonctionne également avec Tomcat:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;

    try {
        httpRequest.setCharacterEncoding(MyAppConfig.getAppSetting("System.Character.Encoding"));

        String appServer = MyAppConfig.getAppSetting("System.AppServer");
        if(appServer.equalsIgnoreCase("JBOSS7")) {
            Field requestField = httpRequest.getClass().getDeclaredField("request");
            requestField.setAccessible(true);
            Object requestValue = requestField.get(httpRequest);

            Field coyoteRequestField = requestValue.getClass().getDeclaredField("coyoteRequest");
            coyoteRequestField.setAccessible(true);
            Object coyoteRequestValue = coyoteRequestField.get(requestValue);

            Method getParameters = coyoteRequestValue.getClass().getMethod("getParameters");
            Object parameters = getParameters.invoke(coyoteRequestValue);

            Method setQueryStringEncoding = parameters.getClass().getMethod("setQueryStringEncoding", String.class);
            setQueryStringEncoding.invoke(parameters, MyAppConfig.getAppSetting("System.Character.Encoding"));

            Method setEncoding = parameters.getClass().getMethod("setEncoding", String.class);
            setEncoding.invoke(parameters, MyAppConfig.getAppSetting("System.Character.Encoding"));
        }

    } catch (NoSuchMethodException nsme) {
        System.err.println(nsme.getLocalizedMessage());
        nsme.printStackTrace();
        MyLogger.logException(nsme);
    } catch (InvocationTargetException ite) {
        System.err.println(ite.getLocalizedMessage());
        ite.printStackTrace();
        MyLogger.logException(ite);
    } catch (IllegalAccessException iae) {
        System.err.println(iae.getLocalizedMessage());
        iae.printStackTrace();
        MyLogger.logException(iae);

    } catch(Exception e) {
        TALogger.logException(e);
    }

    try {
        httpResponse.setCharacterEncoding(MyAppConfig.getAppSetting("System.Character.Encoding"));
    } catch(Exception e) {
        MyLogger.logException(e);
    }
}


2 commentaires

Si vous avez également eu un problème similaire, veuillez poser une nouvelle question.


Ce n'est pas une question. J'ai résolu mon problème, ce qui est exactement le même, avec ce filtre.



0
votes

J'ai fait une fouille de cette question pour que cela puisse aider les autres qui rencontrent le même problème sur Tomcat. Ceci est pris de http://wiki.apache.org/tomcat/faq/characterrencoding .

(Comment utiliser UTF-8 partout).

  • SET URIENCODING = "UTF-8" sur votre in server.xml. Références: connecteur HTTP, connecteur AJP.
  • Utilisez un filtre de codage de caractères avec le codage par défaut défini sur UTF-8
  • Changez tous vos JSPS pour inclure le nom Chart dans leur contenu de contenu. Par exemple, utilisez <% @ page contenttype = "Texte / HTML; Charset = UTF-8"%> pour les pages JSP habituelles et pour les pages de la syntaxe XML (AKA JSP Documents).
  • Changez tous vos servlets pour définir le type de contenu pour les réponses et inclure le nom Charset dans le type de contenu pour être UTF-8. Utilisez Response.setContentType ("Texte / HTML; Charset = UTF-8") ou réponse.setcharacterending ("UTF-8").
  • Modifiez toutes les bibliothèques de génération de contenu que vous utilisez (Velocity, Freemarker, etc.) pour utiliser UTF-8 et pour spécifier UTF-8 dans le type de contenu des réponses qu'ils génèrent.
  • Désactivez toutes les vannes ou filtres pouvant lire les paramètres de la demande avant que votre filtre de codage de caractères ou JSP ait une chance de définir le codage sur UTF-8.

0 commentaires