web-dev-qa-db-fra.com

Encodage UTF-8 dans la page JSP

J'ai une page JSP dont le codage est ISO-8859-1. Cette page JSP se trouve dans un blog de questions et réponses. Je souhaite inclure des caractères spéciaux lors de la publication Q/A. 

Le problème est que JSP ne prend pas en charge le codage UTF-8 même si je l’ai changé de ISO-8859-1 à UTF-8. Ces caractères (~, %, &, +) posent problème. Lorsque je poste ces caractères individuellement ou avec la combinaison de n'importe quel caractère, il est stocké dans la base de données null et lorsque je supprime ces caractères lors de la publication d'une application, cela fonctionne correctement. 

Quelqu'un peut-il suggérer une solution?

24
Shailendra

Vous devez utiliser le même encodage sur toutes les couches de votre application pour éviter ce problème. Il est utile d’ajouter un filtre pour définir le codage:

public void doFilter(ServletRequest request,
                     ServletResponse response,
                     FilterChain chain) throws ServletException {
   request.setCharacterEncoding("UTF-8");
   chain.doFilter(request, response);
}

Pour définir uniquement le codage sur vos pages JSP, ajoutez-leur cette ligne:

<%@ page contentType="text/html; charset=UTF-8" %>

Configurez votre base de données pour utiliser le même encodage de caractères.

Si vous avez besoin de convertir l'encodage d'une chaîne, voir:

Je ne recommanderais pas de stocker du texte codé HTML dans votre base de données. Par exemple, si vous devez générer un PDF (ou autre chose que HTML), vous devez d'abord convertir le codage HTML.

55
Jasper de Vries

La balise JSP complète devrait ressembler à ceci, à part le pageEncoding:

<%@ page language="Java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

Certains anciens navigateurs gâchent aussi avec l'encodage. vous pouvez utiliser la balise HTML

 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

En outre, le fichier doit être enregistré au format UTF-8. Si vous utilisez Eclipse, cliquez sur le fichier -> Propriétés -> Extraire -> Codage du fichier texte.

26
PbxMan

J'ai également eu un problème d'affichage de charectors comme "". J'ai ajouté ce qui suit à mon web.xml.

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>
</jsp-config>

Cela a résolu le problème dans les pages sauf en-tête. J'ai essayé plusieurs façons de résoudre ce problème et rien ne fonctionnait dans mon cas. Le problème avec en-tête était en-tête. La page jsp provient d'un autre fichier jsp. Donc, a donné le codage à l'importation et cela a résolu mon problème. 

<c:import url="/Header1.jsp" charEncoding="UTF-8"/>

Merci

11
Minu George

Vous devez vous assurer que le fichier est enregistré avec le codage UTF-8 . Vous pouvez le faire avec plusieurs éditeurs de texte brut. Avec Notepad ++, c’est-à-dire que vous pouvez choisir dans le menu Encoding--> Encode in UTF-8. Vous pouvez également le faire même avec le Bloc-notes de Windows (Save As -> Encodage UTF-8) . Si vous utilisez Eclipse, vous pouvez le définir dans les propriétés du fichier.

Vérifiez également si le problème est que vous devez échapper ces caractères. Il ne serait pas étrange que ce soit votre problème, car l’un des caractères est &.

5
J.A.I.L.

J'ai utilisé un filtre d'encodage qui a résolu tous mes problèmes d'encodage ... 

 package com.dina.filter;

    import Java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;

    /**
     *
     * @author DINANATH
     */
    public class EncodingFilter implements Filter {

        private String encoding = "utf-8";

        public void doFilter(ServletRequest request,ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
            request.setCharacterEncoding(encoding);
    //                response.setContentType("text/html;charset=UTF-8");
                    response.setCharacterEncoding(encoding);
            filterChain.doFilter(request, response);

        }

        public void init(FilterConfig filterConfig) throws ServletException {
            String encodingParam = filterConfig.getInitParameter("encoding");
            if (encodingParam != null) {
                encoding = encodingParam;
            }
        }

        public void destroy() {
            // nothing todo
        }

    }

dans web.xml

    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>
        com.dina.filter.EncodingFilter
        </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>
5
Dinanath Parit

Cela vous aidera.

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

Ce fil peut vous aider à: Passer des paramètres de requête sous forme de chaînes codées UTF-8

Fondamentalement:

request.setCharacterEncoding("UTF-8");
String login = request.getParameter("login");
String password = request.getParameter("password");

Ou vous utilisez javascript sur un fichier jsp:

var userInput = $("#myInput").val();            
var encodedUserInput = encodeURIComponent(userInput);
$("#hiddenImput").val(encodedUserInput);

et après avoir récupéré en classe:

String parameter = URLDecoder.decode(request.getParameter("hiddenImput"), "UTF-8");
5
Kleber Bernardo

C'est un problème commun. 

l'un des moyens les plus simples à résoudre consiste à vérifier si le caractère spécial atteint l'intérieur du calque d'action, puis à modifier le caractère spécial dans le code Java. 

Si vous êtes en mesure d'afficher ce caractère dans Action ou dans tout autre calque Java de votre choix (comme calque métier), remplacez simplement le caractère par le caractère HTML correspondant à l'aide de StringEscapeUtils.html # escapeHtml

Après avoir échappé. utilisez la nouvelle chaîne pour enregistrer dans la base de données.

4
Naveen Babu

Ce sont des caractères spéciaux en HTML. Pourquoi ne l'encodez-vous pas? Découvrez-le: http://www.degraeve.com/reference/specialcharacters.php

3
Lo Juego

J'ai eu le même problème en utilisant des caractères spéciaux comme délimiteurs sur JSP. Lorsque les caractères spéciaux ont été publiés sur le servlet, ils se sont tous égarés. J'ai résolu le problème en utilisant la conversion suivante:

String str = new String (request.getParameter("string").getBytes ("iso-8859-1"), "UTF-8");
1
Vivek Saxena

Merci pour tous les conseils. En utilisant Tomcat8, j'ai également ajouté un filtre comme celui écrit par @Jasper de Vries. Mais dans les Tomcats les plus récents, il existe un filtre déjà implémenté qui peut être utilisé ou non commenté dans le web.xml de Tomcat:

<filter>
    <filter-name>setCharacterEncodingFilter</filter-name>
    <filter-class>org.Apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <async-supported>true</async-supported>
</filter>
...
<filter-mapping>
    <filter-name>setCharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Et comme tous les autres postés; J'ai ajouté le URIEncoding="UTF-8" au connecteur Tomcat dans Apache. Cela a également aidé.

Il est important de noter qu'Eclipse (si vous utilisez ceci) a une copie de son fichier web.xml et remplace les paramètres Tomcat comme expliqué ci-après: Codage URI UTF-8 cassé dans les JSP

0
leole

j'ajoute ce script shell pour convertir les fichiers jsp de IS

#!/bin/sh

###############################################
## this script file must be placed in the parent  
## folder of the to folders "in" and "out"
## in contain the input jsp files
## out will containt the generated jsp files
## 
###############################################

find in/ -name *.jsp | 
    while read line; do 
        outpath=`echo $line | sed -e 's/in/out/'` ;
        parentdir=`echo $outpath | sed -e 's/[^\/]*\.jsp$//'` ;
        mkdir -p $parentdir
        echo $outpath ;
        iconv -t UTF-8 -f ISO-8859-1 -o $outpath $line ;
    done 
0
Othmen Tiliouine