Warum ist das Zeichen beschädigt, wenn request.getParameter () in Java verwendet wird? [Duplikat]

8

Ich habe einen solchen Link in der JSP-Seite mit der Kodierung big5 Ссылка Und wenn ich es in die URL-Leiste des Browsers eingebe, wird es in etwas wie geändert Ссылка Und wenn wir diesen Parameter in der JSP-Seite haben wollen, sind alle Zeichen beschädigt.

Und wir haben folgendes festgelegt: request.setCharacterEncoding ("UTF-8"), so dass alle Anfragen in UTF8 konvertiert werden.

Aber warum funktioniert das in diesem Fall nicht? Danke im Voraus!.

    
MemoryLeak 02.09.2009, 04:19
quelle

5 Antworten

14

Wenn Sie die URL in die Adressleiste des Browsers eingeben, kann der Browser die Zeichencodierung vor der URL-Codierung konvertieren. Dieses Verhalten ist jedoch nicht gut definiert, siehe meine Frage

Umgang mit Zeichencodierung in URI auf Tomcat

Wir bekommen meistens UTF-8 und Latin-1 auf neueren Browsern, aber wir bekommen alle Arten von Codierungen (einschließlich Big5) in alten. Daher ist es am besten, Nicht-ASCII-Zeichen in URL zu vermeiden, die vom Benutzer direkt eingegeben werden.

Wenn die URL in JSP eingebettet ist, können Sie sie in UTF-8 erzwingen, indem Sie sie wie folgt erzeugen:

%Vor%

Auf Tomcat muss die Codierung auf Connector wie folgt angegeben werden,

%Vor%

Sie müssen auch request.setCharacterEncoding("UTF-8") für die Körpercodierung verwenden, aber es ist nicht sicher, dies im Servlet einzustellen, da dies nur funktioniert, wenn der Parameter nicht verarbeitet wird, aber andere Filter oder Ventile die Verarbeitung auslösen können. Also solltest du es in einem Filter machen. Tomcat kommt mit einem solchen Filter in der Quelldistribution.

    
ZZ Coder 02.09.2009, 06:07
quelle
8

Um zu vermeiden, mit dem server.xml zu spielen, benutze:

%Vor%

Um diese Parameter tatsächlich auf Tomcat zu erhalten Sie müssen etwas wie tun:

%Vor%

Wie anscheinend (?) request.getParameter URLDecodes () die Zeichenkette und interpretiert sie als iso-8859-1 - oder was auch immer URIEncoding in server.xml festgelegt ist. Ein Beispiel dafür, wie man den URIEncoding charset von server.xml für Tomcat 7 bekommt, finden Sie unter hier

    
Mr_and_Mrs_D 06.10.2012 22:43
quelle
6

Sie können keine Nicht-ASCII-Zeichen in einer URL haben - Sie müssen sie immer in Prozent kodieren. Browser haben dabei Schwierigkeiten, sie zu rendern. Rendern funktioniert am besten, wenn Sie die URL in UTF-8 codieren und dann percent-encodieren. Für Ihre spezifische URL würde dies http://hello/world?name=%E5%A9%80%E3%84%89 ergeben (überprüfen Sie in Ihrem Browser, was es ist gibt für diesen speziellen Link). Wenn Sie den Parameter in JSP abrufen, müssen Sie ihn explizit aufheben und ihn dann von UTF-8 dekodieren, da der Browser ihn unverändert sendet.

    
Martin v. Löwis 02.09.2009 04:45
quelle
0

Ich hatte ein Problem mit JBoss 7.0, und ich denke, diese Filterlösung funktioniert auch mit Tomcat:

%Vor%     
ff9will 05.08.2014 17:37
quelle
0

Ich habe zu diesem Thema ziemlich viel gesucht, also könnte dies anderen helfen, die dasselbe Problem mit Tomcat haben. Dies stammt aus Ссылка .

(So verwenden Sie UTF-8 überall).

  • Setze URIEncoding="UTF-8" auf deinem <Connector> in server.xml. Referenzen: HTTP-Connector, AJP-Connector.
  • Verwenden Sie einen Zeichencodierungsfilter mit der Standardcodierung UTF-8
  • Ändern Sie alle Ihre JSPs, um den Zeichensatznamen in ihren contentType aufzunehmen. Verwenden Sie zum Beispiel & lt;% @ page contentType="text / html; charset = UTF-8"% & gt; für die üblichen JSP-Seiten und <jsp:directive.page contentType="text/html; charset=UTF-8" /> für die Seiten in XML-Syntax (alias JSP-Dokumente).
  • Ändern Sie alle Servlets, um den Inhaltstyp für Antworten festzulegen und den Zeichensatznamen in den Inhaltstyp UTF-8 aufzunehmen. Verwenden Sie response.setContentType ("text / html; charset = UTF-8") oder response.setCharacterEncoding ("UTF-8").
  • Ändern Sie alle von Ihnen verwendeten Bibliotheken zur Inhaltsgenerierung (Velocity, Freemarker usw.), um UTF-8 zu verwenden, und geben Sie UTF-8 im Inhaltstyp der von ihnen generierten Antworten an.
  • Deaktivieren Sie alle Ventile oder Filter, die Request-Parameter lesen können, bevor Ihr Zeichencodierungsfilter oder Ihre jsp-Seite die Codierung auf UTF-8 setzen kann.
Tuan 28.04.2016 16:30
quelle