web-dev-qa-db-fra.com

HttpServletRequest - setCharacterEncoding semble ne rien faire

J'essaie de lire les informations UTF-8 à partir de la requête . J'ai utilisé "request.setCharacterEncoding (" UTF-8 ");", mais il semble ne rien faire - les informations lues ne sont pas UTF-8.

Qu'est-ce que je fais mal?

23
Erik Sapir

Si vous utilisez Tomcat, vous devez également définir URIEncoding sur UTF-8 dans vos connecteurs:

<Server port="8105" shutdown="SHUTDOWN">
...
    <Service name="Catalina">
        <Connector port="8180" URIEncoding="UTF-8" />
        <Engine name="Catalina" defaultHost="localhost">
            <Host name="localhost" appBase="webapps" />
        </Engine>
    </Service>
</Server>
23
Maurice Perry

La HttpServletRequest#setCharacterEncoding() n'a d'effet que lorsque la demande est une demande POSTet le corps de la demande est pas déjà traité.

Donc, si cela ne fonctionne pas dans votre cas, cela peut avoir deux causes:

  1. En fait, vous lancez une requête GET. C'est à dire. les paramètres de requête sont envoyés du client au serveur dans l'URL de la requête au lieu du corps de la requête. L'URL de la demande est traitée par le serveur Web, pas par l'API Servlet. Pour résoudre ce problème, vous devez donc configurer le serveur Web en question afin qu'il décode l'URL de la requête à l'aide du codage de caractères spécifié. Dans le cas, par exemple, d'Apache Tomcat, vous devez définir l'attribut URIEncoding du <Connector> dans server.xml sur UTF-8.

  2. Vous utilisez correctement POST, mais vous avez déjà (indirectement) traité le corps de la demande, de sorte qu'il est trop tard pour modifier le codage des caractères. Le corps de la demande ne sera intégralement traité que lors du premier appel d'une méthode getParameterXXX(). Il y a plusieurs d'entre eux. Il ne sera pas traité à nouveau lors d'appels suivants. Lorsque vous indiquez qui appelle cette méthode, n'oubliez pas de prendre en compte toutes les instances déclarées Filter dans web.xml. Certains d'entre eux peuvent saisir et analyser les paramètres.

Si cela ne vous aide toujours pas, la seule cause possible est que la console d'affichage, l'enregistreur ou tout ce que vous utilisez pour imprimer/déterminer/mettre au point le paramètre de requête obtenu ne prend pas en charge UTF-8. Vous voudriez reconfigurer la console/logger/etc pour utiliser UTF-8 à la place pour afficher les caractères. S'il s'agit par exemple de la console Eclipse, vous pouvez le définir par Fenêtre> Préférences> Général> Espace de travail> Codage de fichier texte.

Voir également:

18
BalusC

cette méthode est vraiment stupide. il ne devrait pas être là, et vous ne devriez pas l'utiliser.

pour un corps dans une demande POST, le codage aurait dû être défini explicitement par le client dans l'en-tête Content-Type. sinon, c'est une mauvaise demande. [1]

pour un URI de requête GET, le client ne peut pas spécifier de codage. Le serveur doit disposer d'un codage implicite. Le programmeur doit définir le codage, mais cette méthode n'existe pas dans l'API Servlet! 

cependant, votre conteneur de servlets pourrait avoir un moyen exclusif de le faire.

la meilleure façon consiste probablement à définir le codage par défaut de votre machine virtuelle sur UTF-8.

1: http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7.1

Le paramètre "charset" est utilisé avec certains types de média pour définir le jeu de caractères (section 3.4) des données. Si aucun paramètre de jeu de caractères explicite n'est fourni par l'expéditeur, les sous-types de supports du type "texte" sont définis sur pour avoir une valeur de jeu par défaut de "ISO-8859-1" lorsqu'ils sont reçus via HTTP. Les données contenues dans des jeux de caractères autres que "ISO-8859-1" ou ses sous-ensembles DOIVENT être étiquetées avec une valeur de jeu de caractères appropriée.

5
irreputable

Le problème dépend du serveur d'applications utilisé. La meilleure description, que j'ai trouvée dans ce link

Sur certains serveurs d'applications, la fonction request.setCharacterEncoding(...) n'a d'effet que lorsque vous définissez le codage de l'application à l'aide d'un descripteur. Les plus compliqués sont JBoss, Apache Tomcat, Glassfish. Mieux vaut WebLogic, le meilleur est Jetty (UTF-8 est le paramètre par défaut). 

Dans mon cas, je dois créer un descripteur glassfish-web.xml et y placer la balise parameter-encoding. Dans mon cas, pour GlassFish:

<glassfish-web-app error-url="">
    <!-- request.setCharacterEncoding("UTF-8") not functioning without this setting-->
    <parameter-encoding default-charset="UTF-8" />
</glassfish-web-app>
2
hariprasad

Juste pour confirmer que pour les paramètres POST vous devez appeler request.setCharacterEncoding(...) avant d'obtenir les paramètres . Et pour les paramètres GET, cela dépend du conteneur Web que vous utilisez (utilisez la réponse de Maurice Perry pour Tomcat). 

S'il vous plaît vérifier ce lien pour plus d'informations. "Conversions de caractères entre le navigateur et la base de données" http://Java.Sun.com/developer/technicalArticles/Intl/HTTPCharset/

1
Virasak

faites-vous après tout appel à request.getParameter.

request.setCharacterEncoding("UTF-8") doit être appelé avant tout appel request.getParameter().

1
sushil bharwani

(comme pour la toute première question ..)
si vous lisez les paramètres du corps, il est également possible de lire chaque élément avec son propre encodage (regardez dans la dernière ligne)

ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
List items = null;
try {
    items = upload.parseRequest(request);
} catch (FileUploadException ex) {
    logger.warn("Fail during file upload");
    return uploads;
}

Iterator itr = items.iterator();
while (itr.hasNext()) {
    FileItem item = (FileItem) itr.next();
    if (item.isFormField()) {
        String name = item.getFieldName();
        System.out.println("name: " + name);
        String value = item.getString();
        System.out.println("get as utf8 - "+item.getString("UTF-8"));
0
ozma

il y a une demande de fonctionnalité pour jboss/wildfly https://issues.jboss.org/browse/WFLY-2533

Déposez ceci dans WEB-INF/jboss-web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web version="8.0" xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.jboss.org/j2ee/schema/jboss-web_8_0.xsd">
    <!-- browser tend to not send encoding information, so we have to match the servlet container's
    default encoding with our requested form data encoding: -->
    <default-encoding>UTF-8</default-encoding>
</jboss-web>
0
user1050755