Wir senden hauptsächlich Anfragen über zwei Einreichungsformen an den Server: URL und Form. Die Formularform hat im Allgemeinen keine verstümmelten Probleme, und die verstümmelten Probleme liegen hauptsächlich auf der URL. Durch die Einführung der vorherigen Blogs wissen wir, dass der Prozess des Sendens von Anforderungscodierung per URL wirklich zu verwirrend ist. Unterschiedliche Betriebssysteme, unterschiedliche Browser und unterschiedliche Web -Charakter -Sets führen zu völlig unterschiedlichen Codierungsergebnissen. Ist es nicht zu beängstigend, wenn Programmierer jedes Ergebnis berücksichtigen möchten? Gibt es eine Möglichkeit, sicherzustellen, dass der Client nur eine Codierungsmethode verwendet, um eine Anforderung an den Server auszugeben?
haben! Hier biete ich hauptsächlich die folgenden Methoden
1. JavaScript
Die Verwendung von JavaScript -Codierung gibt dem Browser keine Möglichkeit, einzugreifen. Senden Sie nach der Codierung eine Anforderung an den Server und dekodieren Sie sie dann auf dem Server. Beim Beherrschen dieser Methode benötigen wir drei Methoden der JavaScript -Codierung: Escape (), Encodeuri () und Encodeuricomponent ().
Flucht
Die angegebene Zeichenfolge wird mit dem SIO -Latin -Zeichensatz codiert. Alle Nicht-ASCII-Zeichen werden im %xx-Format als Zeichenfolgen codiert, wobei XX die hexadezimale Zahl darstellt, die dem Zeichen im Zeichensatz entspricht. Beispielsweise beträgt die dem Format entsprechende Codierung %20. Die entsprechende Dekodierungsmethode ist unausweichlich ().
In der Tat kann escs () nicht direkt für die URL-Codierung verwendet werden, seine tatsächliche Funktion besteht darin, den Unicode-kodierten Wert eines Charakters zurückzugeben. Zum Beispiel ist das Ergebnis von "Ich bin cm" oben %U6211 %U662FCM, wobei die entsprechende Codierung von "I" 6211 beträgt, die Codierung von "Ja" 662F und die Codierung von "CM" CM.
Beachten Sie, dass Escape () für die "+" -Codierung nicht korrekt ist. Wir wissen jedoch, dass bei der Übermittlung des Formulars auf der Webseite Leerzeichen vorhanden sind, es in + Zeichen konvertiert wird. Wenn der Server Daten verarbeitet, wird das + Zeichen in Räume verarbeitet. Seien Sie daher vorsichtig, wenn Sie es verwenden.
codieren
Wenn Sie die gesamte URL codieren, wird das utf-8-Format verwendet, um die codierte Zeichenfolge auszugeben. Encodeuri codiert jedoch keine Sonderzeichen außer ASCII -Codierung, wie :! @ # $ & * () =: /; ? + '.
Encodeuricomponent ()
Umwandeln Sie Uri-Zeichenfolgen in Fluchtformat-Saiten im UTF-8-Codierungsformat. Im Vergleich zu Encodeuri wird Encodeuricomponent leistungsfähiger sein und es wird für Symbole (; /?: @ & = + $, #) Codiert, die nicht in encodeuri () codiert sind. Encodeuricomponent codiert jedoch nur die Komponenten der URL einzeln und wird nicht zur Codierung der gesamten URL verwendet. Die entsprechende Dekodierungsfunktionsmethode Decodeuricomponent.
Natürlich verwenden wir normalerweise die Encodeuri -Partei, um Codierungsoperationen durchzuführen. Die sogenannte JavaScript-Codierung und -decodierung zweimal im Hintergrund ist, diese Methode zu verwenden. Es gibt zwei Lösungen, um dieses Problem in JavaScript zu lösen: eine Transkodierung und zwei Transkodierungsmethoden.
Einmal transkodieren
JavaScript -Transkodierung:
var url = '/howMoblieqrcode.servlet?name=i am cm'; window.location.href = cododeuri (URL);
Die transkodierte URL: http://127.0.0.1:8080/perbank/showmoblieqrcode.servlet?name=%E6%88%91%E6%98%AFCM
Backend -Verarbeitung:
String name = request.getParameter ("Name"); System.out.println ("Vordergrund-Eingangsparameter:" + name); name = new String (name.getBytes ("ISO-8859-1"), "UTF-8"); System.out.println ("decodierte Parameter:" + Name);Ausgangsergebnis:
Eingehende Parameter in der Rezeption: ?????? cm
Nach dem Dekodieren von Parametern: Ich bin CM
Sekundäre Transkodierung
JavaScript
var url = '/showMoblieqrcode.servlet?name=i am cm'; window.location.href = cododeuri (comdeuri (url));
Transcodierte URL: http://127.0.0.1:8080/perbank/showmoblieqrcode.servlet?name=%25e6%2588%2591%25e6%2598%25afcm
Backend -Verarbeitung:
String name = request.getParameter ("Name"); System.out.println ("Vordergrund -Eingangsparameter:" + Name); name = urdecoder.decode (name, "utf-8"); System.out.println ("decodierte Parameter:" + Name);Ausgangsergebnis:
Front-End eingehende Parameter: E68891E698AFCM
Nach dem Dekodieren von Parametern: Ich bin CM
Filter
Mit Filtern stellt Filter LZ zwei Typen bereit, die erste ist das Festlegen der Codierung. Die zweite besteht darin, Decodierungsvorgänge direkt im Filter durchzuführen.
Filter 1
Dieser Filter legt direkt das Codierungsformat der Anforderung fest.
öffentliche Klasse Charactercoding implementiert Filter {private filterconfig config; String coding = null; public void destroy () {config = null; } public void dofilter (ServletRequest -Anfrage, ServletResponse -Antwort, Filterchain -Kette) löst IOException, ServletException aus {Request.Setcharactercoding (codieren); chain.dofilter (Anfrage, Antwort); } public void init (filterConfig config) löst servletException {this.config = config; // Konfigurationsparameter sca. str = config.getInitParameter ("codieren") abrufen; if (str! = null) {coding = str; }}} Konfiguration:
<filter> <filter-name>chineseEncodingfilter-name> <filter-class>com.test.filter.CharacterEncodingfilter-class> <init-param> <param-name>encodingparam-name> <param-value>utf-8param-value> init-param> filter> <filter-mapping> <filter-name>chineseEncodingfilter-name> <URL-Muster>/*URL-Muster> Filtermapping>
Filter 2
In der Verarbeitungsmethode dekodiert der Filter die Parameter direkt und setzt dann die dekodierten Parameter in das Anforderungsattribut zurück.
öffentliche Klasse Charactercoding implementiert Filter {Protected FilterConfig FilterConfig; String coding = null; public void destroy () {this.FilterConfig = null; } / *** initialisieren* / public void init (filterconfig filterconfig) {this.filterConfig = filterConfig; } / *** Instrumente in das Encodierungsformular von UTF -8 umwandeln** @param Instrelt eingeben* @return utf - 8's Codierungsformular String* @throws UnsupportedenCodingException* / private String toutf (String Instrument) löscht UnneupportendenCodingException {String outstr = ""; if (instr! } Rückkehr; } / *** chinesische Verarbeitung von Kleidungsfilter* / public void dofilter (ServletRequest ServletRequest, ServletResponse ServletResponse, Filterchain -Kette) löst IoException, ServleTexception {httpServletRequest Request = (httpServletRequest) servletRequest; HttpServletResponse response = (httpServletResponse) servletResponse; // Die Methode zum Abholen der Anforderung (1. post oder 2.get) und eine andere Verarbeitung erfolgt gemäß verschiedenen Anforderungsmethoden String -Methode = Request.getMethod (); // 1. Für Anfragen, die in Post eingereicht wurden, setzen Sie die Codierung direkt auf UTF-8 if (method.equalSignoreCase ("post")) {try {request.setcharactercoding ("utf-8"); } catch (unportedenCodingException e) {e.printstacktrace (); }} // 2. Anfrage in Get sonst {// den von der Client Enumeration -Parameter gesetzten Parameter ausgeliefert von Paramnames = Request.GetParameternames (); // Durchqueren Sie den Parameter, um den Namen und den Wert jedes Parameters zu erhalten (Paramnames.hasmoreElements ()) {String name = paramnames.NextElement (); // Nehmen Sie den Parameternamen String -Werte [] = Anfrage an. GETPARAMETERVALUS (Name); // Nehmen Sie seinen Wert nach dem Parametername, wenn der Parameter -Name nicht leer ist. Setzen Sie für (int i = 0; i <values.length; i ++) {try {// Kreis zurück und rufen Sie jeden Wert toutf (values [i]) Methode auf, um die Zeichencodierung der Parameterwert -String vlustr = toutf (Werte [i]) zu konvertieren. Werte [i] = vlustr; } catch (unportedenCodingException e) {e.printstacktrace (); }} // den Wert in der Form eines Attributs in Request Request.SetatTribute (Name, Werte) ausblenden; }}} // Setzen Sie die Antwortmethode und unterstützen Sie chinesische Zeichensatze Antwort. // Führen Sie den nächsten Filter weiter aus. Wenn es keinen Filter gibt, die Anfragekette.Dofilter (Anfrage, Antwort); }}Konfiguration:
<Filter> <filter-name> chinesiaCodingfilter-name> <filterklasse> com.test.filter.charactercodingfilter-classe> filter> <filtermapping> <filter-name> chinesische
andere
1. Setzen Sie PageCoding und ContentType
<%@ page Language = "java" contentType = "text/html;
charset = utf-8 "pageCoding =" utf-8 "%>
2. Richten Sie die Uriencodierung von Tomcat ein
Standardmäßig verwendet der Tomcat-Server das ISO-8859-1-Codierungsformat, um die vom Parameter Uriencodierung angeforderte URL zu codieren. Daher müssen wir dem Tag der Server.xml-Datei von Tomcat nur URiencoding = "UTF-8" hinzufügen.
Das obige dreht sich alles um diesen Artikel. Ich hoffe, es wird für alle hilfreich sein, Java Chinese verstümmelt zu lernen.