web-dev-qa-db-fra.com

request.getParameter () n'affiche pas correctement le codage de caractères dans le servlet Java

J'ai un problème avec UTF-8 dans le fichier de servlet Java. Lorsque j'obtiens la valeur du paramètre dans l'URL, j'ai un problème avec les caractères UTF-8. Il n’affiche pas correctement les caractères japonais.

Jsp en-tête a déjà

<%@ page language="Java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

J'ai ajouté le paramètre URIEncoding dans le connecteur à UTF-8 dans server.xml.

<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

J'ai écrit le code comme suit dans jsp.

<s:textfield key="txt_name" name="txt_name" id="txt_name"
maxlength="64"></s:textfield>

<a href="javascript:showModalWindow('PopUpFile!init.action?<%=Common.PASSWORD%>=<%=Common.encript(ID, Code)%>','',940,650);">
<s:property value="PopUp Link" />
</a>

<script>
    function showModalWindow(x_URL, x_ARG, x_WIDTH, x_HEIGHT) {
        var x_OPT = "dialogHeight: " + x_HEIGHT + "px; " + "dialogWidth: "
                + x_WIDTH + "px; "
                + "Edge: Raised; center: Yes; resizable: Yes; status: Yes;";
        x_URL += "&name="+document.getElementById("txt_name").value;
        var retValue = window.showModalDialog(x_URL, x_ARG, x_OPT);
        if (retValue != null) {
            document.forms.frm.action = "ParentFile!getUser.action";
            document.forms.frm.submit();
        }
    }
</script>

Et puis, j'ai écrit le code comme suit dans le servlet Java.

if(g_request.getParameter("name") != null){
    g_session.setAttribute(NAME, g_request.getParameter("name"));
}

J'ai également testé la méthode request.setCharacterEncoding() dans un servlet Java, mais cela ne fonctionne pas vraiment. Bien que j'aie essayé de nombreuses manières de résoudre le problème des autres personnes lié au codage de caractères dans une servlet dans stackoverflow, je ne peux pas résoudre mon problème avant.

Que puis-je faire pour afficher correctement le codage de caractères? Merci d'avance.

7
Sandar Min Aye

La plupart des serveurs, y compris le serveur Apache Tomcat, sont configurés pour paramétrer le codage avec ISO-8859-1 par défaut. Je pense que cela ne changera que si vous avez une instance de serveur dédié privé. La technique du programmeur consiste donc à encoder/décoder ces paramètres manuellement. Comme vous utilisez javascript, il existe une fonction intégrée encodeURI() ou encodeURIComponent(). Voir Comment encoder une URL en JavaScript . Le code devrait changer

x_URL += "&name="+encodeURI(document.getElementById("txt_name").value);

en Java, utilisez URLDecoder pour décoder le paramètre.

Java.net.URLDecoder.decode(((String[])request.getParameterMap().get("name"))[0], "UTF-8"));

Notez que si vous utilisez le type de résultat Struts2 dispatcher, vous n'avez pas besoin de décoder les paramètres de la chaîne de requête. Ces paramètres sont analysés via UrlHelper.

Cependant, je ne me souviens pas quand je décodai, ces paramètres sont automatiquement décodés dans Struts2.

En règle générale, vous devez savoir que si vous transmettez des paramètres dans l'URL, ils doivent être codés par l'URL. Si vous soumettez le formulaire, il n’est pas nécessaire de le faire car il s’agit du x-www-form-urlencoded, voir 17.13.4 Types de contenu du formulaire .

12
Roman C

Testez-vous la sortie en utilisant System.out.println? Si c'est le cas, il se peut qu'il ne soit pas configuré pour UTF-8.

Voir ceci: Impossible d'envoyer des caractères spéciaux (UTF-8) de JSP à Servlet: points d'interrogation affichés

Assurez-vous également que vous exécutez request.setCharacterEncoding("UTF-8") AVANT de lire les paramètres.

8
stepanian

J'ai une erreur similaire et le résoudre, utilisez le filtre Servlet si vous utilisez Spring, ajoutez simplement cette définition à web.xml

<!-- CharacterEncodingFilter / UTF-8 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
            <init-param>
                <param-name>forceEncoding</param-name>
                <param-value>true</param-value>
            </init-param>
        </filter>

        <filter-mapping>
            <filter-name>encodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

si vous n'utilisez pas Spring, écrivez un filtre de servlet du type:

protected void doFilterInternal(HttpServletRequest request,
            HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        //Set character encoding as UTF-8
        request.setCharacterEncoding("UTF-8");
        filterChain.doFilter(request, response);
    }
3
erhun

Je voudrais échanger un commentaire de f.khantsis sur une réponse, car il s’est avéré être important dans mon cas.

Important: assurez-vous que ce filtre est effectué EN PREMIER, avant tout autre, sinon cela ne fonctionnera pas.

Nous avions un paramètre de codage correct dans notre filtre de servlet:

    request.setCharacterEncoding("UTF-8");

Mais lorsque je mets un point d'arrêt dans request.getParameter, cela indique que nous lisons les paramètres avant de définir le codage. Cela se passait dans un autre filtre (CSRF). A ce moment, le codage était gelé et le réglage était inefficace. Cela peut dépendre du serveur mais dans notre cas (Websphere) c'était le cas.

0
Jarekczek