java comment décoder obtenir l'url le paramètre reçu jeter BeanParam

je reçois un GET réponse à ce service web

@GET
@Path("/nnnnnn")
public Response pfpfpfpf(@BeanParam NNNNNN n)

la classe NNNNN a:

@QueryParam("parameter")
private String parameter;

et pour ce parameter il y a un get and set.

j'envoie une requête sur un get avec un paramètre de requête et il est lié automatiquement à mon option NNNN, tout est génial.

mais, maintenant j'envoie des cordes japonaises l'url de la requête. Je code le paramétreur par UTF-8 avant de l'envoyer, et je dois les décoder en utilisant UTF-8.

mais ma question Est devrais-je appeler le Urldécodeur? j'ai essayé de l'appeler dans le getter de ce paramètre, mais ça n'a pas marché, j'ai continué à avoir quelque chose comme C3%98%C2%B4%C3%98%C2 au lieu des caractères japonais

13
demandé sur Mike 2015-10-30 18:37:39

2 réponses

la solution qui fonctionne pour moi est:

sur le servlet, je devrais faire ceci:

request.setCharacterEncoding("UTF-8");

puis sur la page html j'ai dû ajouter ceci:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4
répondu Marco Dinatsoli 2015-11-05 15:46:14

C'est une bonne question qui a le potentiel clair de nombreux doutes sur la façon dont l'information est traitée (codée et décodée) entre les systèmes.

avant de poursuivre je dois dire avoir une compréhension juste sur le Charset, encodage, etc. Vous pouvez lire cette réponse pour une mise en garde rapide.

cela doit regarder de 2 perspectives - navigateur et serveur.

perspective du navigateur D'encodage

chaque navigateur va rendre l'information/le texte, maintenant pour rendre l'information/le texte, il doit savoir comment interpréter ces bits/octets afin qu'il puisse rendre correctement ( lire mon 3ème puce de réponse que la façon dont les mêmes bits peuvent représenter des caractères différents dans le schéma d'encodage différent ).

Navigateur le codage de la page

  • Chaque navigateur aura un encodage par défaut associé avec elle. Cochez cette case pour voir l'encodage par défaut du navigateur .
  • si vous ne spécifiez pas d'encodage sur votre page HTML alors l'encodage par défaut du navigateur prendra effet et rendra la page selon ces règles d'encodage. donc, si l'encodage par défaut est ASCII et que vous utilisez le japonais ou le chinois ou des caractères du plan supplémentaire Unicode, alors vous verrez la valeur garbage.
  • vous pouvez dire à browser Que faire n'utilisez pas votre schéma d'encodage par défaut, mais utilisez celui-ci pour rendre par site Web, en utilisant <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> .
    • Et ce exactement ce que vous avez fait/trouvé et que vous avez été bien parce que cette meta tag essentiellement l'emportait sur l'encodage par défaut du navigateur.
    • une autre façon d'obtenir le même effet est de ne pas utiliser cette balise meta, mais de simplement changer l'encodage par défaut du navigateur et vous serez toujours très bien. Mais ce n'est pas recommandé et l'utilisation de la balise Content-Type meta dans votre JSP est recommandée.

essayez de jouer avec l'encodage par défaut du navigateur et la balise meta en utilisant le HTML simple ci-dessous.

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        の, は, でした <br></br>
        昨夜, 最高
    </body>        
</html>

Serveur de point de vue de l'Encodage

serveur doit également savoir interpréter le flux de données entrant, qui signifie essentiellement ce qui schéma d'encodage à utiliser ( serveur la partie est délicate car il y a plusieurs possibilités ). Lire ci-dessous de ici

lorsque des données saisies dans des formulaires HTML sont soumises, le formulaire les noms et les valeurs des champs sont encodés et envoyés au serveur dans un HTTP message de demande d'aide de la méthode GET ou POST, ou, historiquement, par e-mail. L'encodage utilisé par défaut est basé sur une première version de la URI général pourcentage-encodage les règles, avec un certain nombre de modifications comme la normalisation newline et le remplacement des espaces par " + " au lieu de "%20". le type MIME de données codées de cette façon est application/x-www-form-urlencoded, et il est actuellement défini (encore d'une manière très dépassée) dans les spécifications HTML et XForms. Dans de plus, la spécification CGI contient des règles sur la façon dont les serveurs web décoder les données de ce type et les mettre à la disposition des applications.

Ceci a encore une fois 2 parties qui montrent comment le serveur doit décoder le flux de requête entrant et comment il doit encoder le flux de réponse sortant.

il y a plusieurs façons de faire cela selon le cas d'utilisation, par exemple:

  • il y a des méthodes comme setCharacterEncoding , setContentType etc. dans L'objet de requête et de réponse HTTP, qui peut être utilisé pour définir l'encodage.
    • C'est exactement ce que vous avez fait dans votre cas que vous avez dit au serveur qui utilisent le schéma D'encodage UTF-8 pour décoder les données de la requête parce que je m'attends à des caractères Unicode supplémentaires. Mais ce n'est pas tout, s'il vous plaît ne lire plus ci-dessous.
  • définit l'encodage au niveau du serveur ou JVM, en utilisant des attributs JVM comme -Dfile.encoding=utf8 . Lire cet article sur la façon de configurer le codage du serveur.

Dans votre cas, vous récupériez les caractères japonais à partir de la chaîne de requête de L'URL et la chaîne de requête fait partie de L'objet de requête HTTP, donc en utilisant request.setCharacterEncoding("UTF-8"); vous avez été en mesure d'obtenir le résultat d'encodage désiré.

mais cela ne fonctionnera pas pour le codage D'URL, qui est différent du codage de requête (votre cas). Considérons l'exemple ci-dessous, dans les deux sysout vous ne serez pas en mesure de voir l'encodage souhaité effet, même après l'utilisation de request.setCharacterEncoding("UTF-8"); parce que Ici vous voulez encoder URL puisque L'URL sera quelque chose comme http://localhost:7001/springapp/forms/executorTest/encodingTest/hellothere 昨夜, 最高 et dans cette URL il n'y a pas de chaîne de requête.

@RequestMapping(value="/encodingTest/{quertStringValue}", method=RequestMethod.GET)
    public ModelAndView encodingTest(@PathVariable("quertStringValue") String quertStringValue, ModelMap model, HttpServletRequest request) throws UnsupportedEncodingException {
        System.out.println("############### quertStringValue " + quertStringValue);
        request.setCharacterEncoding("UTF-8");
        System.out.println("############### quertStringValue " + quertStringValue);
        return new ModelAndView("ThreadInfo", "ThreadInfo", "@@@@@@@ This is my encoded output " + quertStringValue);
    }

selon le cadre que vous utilisez, vous pouvez avoir besoin d'une configuration supplémentaire pour spécifier un encodage de caractères pour les requêtes ou les URLs de sorte que vous pouvez soit appliquer votre propre encodage si la requête ne spécifie pas déjà un encodage, ou appliquer l'encodage dans tous les cas. Cela est utile parce que les navigateurs courants ne font généralement pas définissez un encodage de caractères même s'il est spécifié dans la page ou le formulaire HTML.

au printemps, il y a org.springframework.web.filter.CharacterEncodingFilter pour configurer l'encodage des requêtes. Lisez cette question intéressante similaire qui est basée sur ce fait.

en coque

tout programme d'ordinateur qu'il s'agisse d'un serveur d'application, d'un serveur web, d'un navigateur, D'un IDE, etc. ne comprend que les bits, il a donc besoin de savoir comment interpréter les bits pour faire en effet, selon l'encodage utilisé, les mêmes bits peuvent représenter des caractères différents. et c'est là que" Encoding " entre en scène en donnant un identifiant unique pour représenter un caractère de sorte que tous les programmes informatiques, divers OS, etc. sait exact de la bonne façon de l'interpréter.

1
répondu hagrawal 2017-05-23 12:13:50