Nous envoyons principalement des demandes au serveur via deux formes de soumission: URL et formulaire. La forme de forme n'a généralement pas de problèmes brouillés, et les problèmes brouillés sont principalement sur l'URL. Grâce à l'introduction des blogs précédents, nous savons que le processus d'envoi de demande d'encodage au serveur par URL est vraiment trop déroutant. Différents systèmes d'exploitation, différents navigateurs et différents jeux de caractères Web conduiront à des résultats d'encodage complètement différents. N'est-ce pas trop effrayant si les programmeurs veulent prendre en compte chaque résultat? Existe-t-il un moyen de s'assurer que le client n'utilise qu'une seule méthode d'encodage pour émettre une demande au serveur?
avoir! Ici, je fournis principalement les méthodes suivantes
1. Javascript
L'utilisation de codage JavaScript ne donne pas au navigateur une chance d'intervenir. Après encodage, envoyez une demande au serveur, puis décodez-la dans le serveur. Lors de la maîtrise de cette méthode, nous avons besoin de trois méthodes de codage JavaScript: Escape (), Encodeuri () et EncodeuRIComponent ().
s'échapper
La chaîne spécifiée est codée à l'aide du jeu de caractères SIO Latin. Tous les caractères non ASCII sont codés sous forme de chaînes au format% xx, où xx représente le nombre hexadécimal correspondant au caractère du jeu de caractères. Par exemple, le codage correspondant au format est% 20. Sa méthode de décodage correspondante est un Escape ().
En fait, Escape () ne peut pas être utilisé directement pour le codage de l'URL, sa fonction réelle est de renvoyer la valeur codée par un personnage. Par exemple, le résultat de "Je suis CM" ci-dessus est% U6211% U662FCM, où le codage correspondant de "I" est 6211, le codage de "oui" est 662f, et le codage de "CM" est CM.
Notez que Escape () n'est pas correct pour le codage "+". Mais nous savons que s'il y a des espaces sur la page Web lors de la soumission du formulaire, il sera converti en caractères +. Lorsque le serveur traite les données, le signe + sera transformé en espaces. Par conséquent, soyez prudent lorsque vous l'utilisez.
encodéuri
Encodant l'URL entière, il utilise le format UTF-8 pour sortir la chaîne codée. Cependant, Encodeuri n'encodera pas certains caractères spéciaux, sauf le codage ASCII, tel que :! @ # $ & * () =: /; ? + '.
EncodeuRIComponent ()
Convertissez les chaînes URI en chaînes de format d'échappement au format de codage UTF-8. Par rapport à Encodeuri, EncodeuriComponent sera plus puissant, et il sera codé pour les symboles (; / ?: @ & = + $, #) qui ne sont pas codés dans Encodeuri (). Cependant, EncodeuriComponent ne codera que les composants de l'URL individuellement et ne sera pas utilisé pour coder l'URL entière. La méthode de décodage de décodage correspondante.
Bien sûr, nous utilisons généralement la partie encodéuri pour effectuer des opérations d'encodage. Le soi-disant codage JavaScript et le décodage deux fois en arrière-plan consiste à utiliser cette méthode. Il existe deux solutions pour résoudre ce problème dans JavaScript: une méthodes de transcodage et deux transcoding.
Transcoding une fois
Transcodage javascript:
var url = '/showmoblieqrcode.servlet?name=i am cm'; window.location.href = encodeuri (url);
L'URL transcodée: http://127.0.0.1:8080/perbank/showmoblieqrcode.servlet?name=%E6%88%91%E6%98%AFCM
Traitement du backend:
String name = request.getParameter ("name"); System.out.println ("Paramètres entrants de premier plan:" + name); name = new String (name.getBytes ("iso-8859-1"), "utf-8"); System.out.println ("Paramètres décodés:" + nom);Résultat de sortie:
Paramètres entrants dans la réception: ?????? CM
Après les paramètres de décodage: je suis CM
Transcoding secondaire
javascrip
var url = '/showmoblieqrcode.servlet?name=i am cm'; window.location.href = encodeuri (encodeuri (url));
URL transcodée: http://127.0.0.1:8080/perbank/showmoblieqrcode.servlet?name=%25E6%2588%2591%25E6%2598%25AFCM
Traitement du backend:
String name = request.getParameter ("name"); System.out.println ("Paramètres entrants de premier plan:" + nom); name = urldecoder.decode (name, "utf-8"); System.out.println ("Paramètres décodés:" + nom);Résultat de sortie:
Paramètres entrants frontaux: E68891E698AFCM
Après les paramètres de décodage: je suis CM
filtre
À l'aide des filtres, Filter LZ fournit deux types, le premier consiste à définir le codage et le second consiste à effectuer des opérations de décodage directement dans le filtre.
Filtre 1
Ce filtre définit directement le format d'encodage de la demande.
Classe publique LeCatorCcoding implémente Filter {private filterConfig config; String Encoding = null; public void destre () {config = null; } public void dofilter (ServLetRequest Request, ServletResponse Response, FilterChain Chain) lève IOException, ServletException {request.SetcharAtterencoding (Encoding); chain.dofilter (demande, réponse); } public void init (filterConfig config) lève Servlexception {this.config = config; // Obtenir les paramètres de configuration String str = config.getInitParameter ("Encoding"); if (str! = null) {coding = str; }}} Configuration:
<Filter> <Filter-Name> ChineseencodingFilter-Name> <Filter-Class> com.test.filter.characterencodingfilter-class> <Init-Param> <AmAram-Name> EncodingParam-Name> <AmAr-Value> Utf-8param-Value> init-Param> Filter> <Mapping-mapping> <url-sattern> / * URL-sattern> mappage de filtre>
Filtre 2
Dans la méthode de traitement, le filtre décode directement les paramètres, puis réinitialise les paramètres décodés à l'attribut de demande.
La classe publique est de carter encoding implémente filter {protégée filterConfig filterConfig; String Encoding = null; public void destre () {this.filterConfig = null; } / ** * Initialize * / public void init (filterConfig filterConfig) {this.filterConfig = filterConfig; } / ** * Convertiss Instr dans le formulaire d'encodage d'UTF-8 * * @param instl entrent string * @return utf - 8's Encoding Form String * @Throws UnsupportEDenCcodingException * / private String toutf (String instr) lève unportEnCoDingException {String outStr = ""; if (instr! = null) {outstr = new String (instr.getBytes ("iso-8859-1"), "utf-8"); } return outstr; } / ** * Traitement de filtrage brouillé chinois * / public void dofilter (servletequest servletequest, servletResponse servletResponse, filterchain chaîne) lance ioException, servlexception {httpservletRequest request = (httpservletRequest) ServLetRequest; HttpServletResponse Response = (httpServletResponse) servletResponse; // la méthode pour obtenir la demande (1.post ou 2.get), et un traitement différent est effectué en fonction de différentes méthodes de demande méthode de chaîne = request.getMethod (); // 1. Pour les demandes soumises dans le post, définissez directement l'encodage sur UTF-8 if (method.equalsignorecase ("post")) {try {request.SetcharAtterencoding ("utf-8"); } catch (UnportEnCcodingException e) {e.printStackTrace (); }} // 2. Demande soumise dans Get Else {// Sortez le jeu de paramètres soumis par le client Enuation ParamNames = request.getParameterNames (); // Traversé le paramètre défini pour sortir le nom et la valeur de chaque paramètre while (paramNames.hasmoreElements ()) {String name = paramNames.nextelement (); // supprimer le nom de paramètre Valeurs de chaîne [] = request.getParameTervalues (Nom); // supprimer sa valeur en fonction du nom de paramètre // le paramètre définit la valeur de paramètre est vide si (valeurs! = Null) (int i = 0; i <valeurs.length; i ++) {try {// Certes en arrière et appelez chaque valeur toutf (valeurs [i]) pour convertir le codage de caractères de la chaîne de valeur du paramètre vlustr = toutf (valeurs [i]); valeurs [i] = vlustr; } catch (UnportEnCcodingException e) {e.printStackTrace (); }} // masquer la valeur sous la forme d'un attribut dans request request.setAttribute (nom, valeurs); }}} // Définissez la méthode de réponse et supportez le jeu de caractères chinois Response.SetContentType ("text / html; charset = utf-8"); // Continuez à exécuter le filtre suivant. S'il n'y a pas de filtre, la chaîne de demande.Dofilter (demande, réponse); }}Configuration:
<filter> <filter-name> ChineseencodingFilter-Name> <Filter-Class> com.test.filter.characterencodingFilter-Class> Filter> <Filter-Mapping> <Filter-Name> ChineseencodingFilter-Name> <Url-Pattern> / * URL-Pattern> Filter-Mapping>
autre
1. Définir Pageencoding et ContentType
<% @ page Language = "Java" ContentType = "Text / HTML;
charset = utf-8 "pageencoding =" utf-8 "%>
2. Configurez l'urien de Tomcat
Par défaut, le serveur Tomcat utilise le format de codage ISO-8859-1 pour coder l'URL demandée par le paramètre URIENCODING, nous n'avons donc qu'à ajouter uriencoding = ”utf-8” à la balise du fichier server.xml de TomCat.
Ce qui précède concerne cet article. J'espère qu'il sera utile pour tout le monde d'apprendre des questions java chinoises.