Ich muss UTF-8 in meiner Java-Webanwendung (Servlets + JSP, kein Framework verwendet) zum Laufen bringen, um äöå
usw. finnischen Text und kyrillische Alphabete wie in ЦжФ
Sonderfällen zu unterstützen.
Mein Setup ist das folgende:
- Entwicklungsumgebung: Windows XP
- Produktionsumgebung: Debian
Verwendete Datenbank: MySQL 5.x.
Benutzer verwenden hauptsächlich Firefox2, aber auch Opera 9.x, FF3, IE7 und Google Chrome werden verwendet, um auf die Website zuzugreifen.
Wie erreicht man das?
Antworten:
Wenn ich als FAQ dieser Website antworte, wird dies gefördert. Das funktioniert bei mir:
Meistens sind Zeichen äåö kein Problem, da der von Browsern und Tomcat / Java für Webapps verwendete Standardzeichensatz latin1 ist, d. H. ISO-8859-1, die diese Zeichen "versteht".
Damit UTF-8 unter Java + Tomcat + Linux / Windows + MySQL funktioniert, ist Folgendes erforderlich:
Konfigurieren der server.xml von Tomcat
Es muss konfiguriert werden, dass der Connector UTF-8 verwendet, um URL-Parameter (GET-Anforderung) zu codieren:
Der Schlüsselteil ist URIEncoding = "UTF-8" im obigen Beispiel. Dies garantiert, dass Tomcat alle eingehenden GET-Parameter als UTF-8-codiert behandelt. Wenn der Benutzer Folgendes in die Adressleiste des Browsers schreibt:
Das Zeichen ж wird als UTF-8 behandelt und als % D0% B6 (normalerweise vom Browser, bevor es überhaupt zum Server gelangt ) codiert .
POST-Anfragen sind davon nicht betroffen.
Zeichensatzfilter
Dann ist es Zeit, die Java-Webanwendung zu zwingen, alle Anforderungen und Antworten als UTF-8-codiert zu verarbeiten. Dies erfordert, dass wir einen Zeichensatzfilter wie folgt definieren:
Dieser Filter stellt sicher, dass UTF-8 festgelegt ist, wenn der Browser die in der Anforderung verwendete Codierung nicht festgelegt hat.
Die andere Aufgabe dieses Filters besteht darin, die Standardantwortcodierung festzulegen, d. H. die Kodierung, in der das zurückgegebene HTML / was auch immer ist. Die Alternative besteht darin, die Antwortcodierung usw. in jedem Controller der Anwendung festzulegen.
Dieser Filter muss der Datei web.xml oder dem Bereitstellungsdeskriptor der Webanwendung hinzugefügt werden:
Die Anweisungen zum Erstellen dieses Filters finden Sie im Tomcat-Wiki ( http://wiki.apache.org/tomcat/Tomcat/UTF-8 ).
JSP-Seitencodierung
Fügen Sie in Ihrer web.xml Folgendes hinzu:
Alternativ müssten auf allen JSP-Seiten der Webanwendung Folgendes angezeigt werden:
Wenn eine Art Layout mit verschiedenen JSP-Fragmenten verwendet wird, ist dies in allen erforderlich .
HTML-Meta-Tags
Die JSP-Seitencodierung weist die JVM an, die Zeichen auf der JSP-Seite in der richtigen Codierung zu behandeln. Dann ist es Zeit, dem Browser mitzuteilen, in welcher Codierung die HTML-Seite ist:
Dies geschieht oben auf jeder von der Webanwendung erstellten xhtml-Seite wie folgt:
JDBC-Verbindung
Bei Verwendung einer Datenbank muss definiert werden, dass die Verbindung eine UTF-8-Codierung verwendet. Dies erfolgt in context.xml oder überall dort, wo die JDBC-Verbindung fehlerhaft ist, wie folgt:
MySQL-Datenbank und -Tabellen
Die verwendete Datenbank muss UTF-8-Codierung verwenden. Dies wird erreicht, indem die Datenbank wie folgt erstellt wird:
Dann müssen alle Tabellen auch in UTF-8 sein:
Der Schlüsselteil ist CHARSET = utf8 .
MySQL Server Konfiguration
MySQL Serveri muss ebenfalls konfiguriert werden. In der Regel erfolgt dies unter Windows durch Ändern der Datei my.ini und unter Linux durch Konfigurieren der Datei my.cnf. In diesen Dateien sollte definiert werden, dass alle mit dem Server verbundenen Clients utf8 als Standardzeichensatz verwenden und dass der vom Server verwendete Standardzeichensatz auch utf8 ist.
MySQL-Prozeduren und -Funktionen
Für diese muss auch der Zeichensatz definiert sein. Zum Beispiel:
GET-Anfragen: latin1 und UTF-8
Wenn in tomcats server.xml definiert ist, dass GET-Anforderungsparameter in UTF-8 codiert sind, werden die folgenden GET-Anforderungen ordnungsgemäß behandelt:
Da ASCII-Zeichen sowohl mit latin1 als auch mit UTF-8 auf die gleiche Weise codiert werden, wird die Zeichenfolge "Petteri" korrekt behandelt.
Das kyrillische Zeichen ж wird im Lateinischen1 überhaupt nicht verstanden. Da Tomcat angewiesen wird, Anforderungsparameter als UTF-8 zu behandeln, wird dieses Zeichen korrekt als % D0% B6 codiert .
Wenn Browser angewiesen werden, die Seiten in UTF-8-Codierung (mit Anforderungsheadern und HTML-Meta-Tag) zu lesen, codieren mindestens Firefox 2/3 und andere Browser aus dieser Zeit das Zeichen selbst als % D0% B6 .
Das Endergebnis ist, dass alle Benutzer mit dem Namen "Petteri" und auch alle Benutzer mit dem Namen "ж" gefunden werden.
Aber was ist mit äåö?
Die HTTP-Spezifikation definiert, dass URLs standardmäßig als latin1 codiert sind. Dies führt dazu, dass Firefox2, Firefox3 usw. Folgendes codiert
in die verschlüsselte Version
In latin1 wird das Zeichen ä als % E4 codiert . Obwohl die Seite / Anfrage / alles für die Verwendung von UTF-8 definiert ist . Die UTF-8-codierte Version von ä ist % C3% A4
Dies hat zur Folge, dass die Webanwendung die Anforderungsparameter von GET-Anforderungen nicht richtig verarbeiten kann, da einige Zeichen in latin1 und andere in UTF-8 codiert sind. Hinweis: POST-Anforderungen funktionieren, wenn Browser alle Anforderungsparameter aus Formularen vollständig in UTF-8 codieren, wenn die Seite als UTF-8 definiert ist
Sachen zum Lesen
Ein großes Dankeschön an die folgenden Autoren für die Antworten auf mein Problem:
Wichtige Notiz
MySQLunterstützt die grundlegende mehrsprachige Ebene mit 3-Byte-UTF-8-Zeichen. Wenn Sie darüber hinausgehen müssen (bestimmte Alphabete erfordern mehr als 3 Byte UTF-8), müssen Sie entweder eine
VARBINARY
Spalte vom Spaltentyp verwenden oder denutf8mb4
Zeichensatz verwenden (für den MySQL 5.5.3 oder höher erforderlich ist). Beachten Sie jedoch, dass die Verwendung desutf8
Zeichensatzes in MySQL nicht 100% der Zeit funktioniert.Kater mit Apache
Eine weitere Sache Wenn Sie den Apache + Tomcat + mod_JK-Connector verwenden, müssen Sie auch folgende Änderungen vornehmen:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
/etc/httpd/conf
und fügen SieAddDefaultCharset utf-8
inhttpd.conf file
. Hinweis: Überprüfen Sie zunächst, ob es vorhanden ist oder nicht. Falls vorhanden, können Sie es mit dieser Zeile aktualisieren. Sie können diese Zeile auch unten hinzufügen.quelle
pageEncoding
, sodass Sie sie sogar weglassen können. 2) In der von Ihnen verwendeten MySQL-Datenbank und den von Ihnen verwendeten Tabellenutf8_swedish_si
sollte dies der Fall seinutf8_unicode_ci
. Sie könnten sogar die Zusammenstellung weglassen, ist einfachCHARACTER SET utf8
genug.<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
2. Gehen Sie zu Ihrem Apache-Ordner, dh/etc/httpd/conf
fügenAddDefaultCharset utf-8
Sie die Datei 'httpd.conf' hinzu. Hinweis: Überprüfen Sie zuerst, ob es vorhanden ist oder nicht. Falls vorhanden, können Sie es mit dieser Zeile aktualisieren. Sie können diese Zeile auch unten hinzufügen.Ich denke, Sie haben es in Ihrer eigenen Antwort ganz gut zusammengefasst.
Während Sie UTF-8-ing (?) Von Ende zu Ende ausführen, möchten Sie möglicherweise auch sicherstellen, dass Java selbst UTF-8 verwendet. Verwenden Sie -Dfile.encoding = utf-8 als Parameter für die JVM (kann in Catalina.bat konfiguriert werden).
quelle
Um die Antwort von kosoant zu ergänzen, können Sie , wenn Sie Spring verwenden, anstatt Ihren eigenen Servlet-Filter zu schreiben, die von ihnen bereitgestellte Klasse verwenden
org.springframework.web.filter.CharacterEncodingFilter
und sie wie folgt in Ihrer web.xml konfigurieren:quelle
Ich möchte auch von hier aus hinzufügen , dass dieser Teil mein utf-Problem gelöst hat:
quelle
Dies ist für die griechische Codierung in MySQL-Tabellen vorgesehen, wenn wir mit Java darauf zugreifen möchten:
Verwenden Sie den folgenden Verbindungsaufbau in Ihrem JBoss-Verbindungspool (mysql-ds.xml).
Wenn Sie dies nicht in einen JNDI-Verbindungspool einfügen möchten, können Sie es als JDBC-URL konfigurieren, wie in der nächsten Zeile dargestellt:
Für mich und Nick, also vergessen wir es nie mehr und verschwenden keine Zeit mehr .....
quelle
Schöne ausführliche Antwort. Ich wollte nur noch eine Sache hinzufügen, die anderen definitiv helfen wird, die UTF-8-Codierung auf URLs in Aktion zu sehen.
Führen Sie die folgenden Schritte aus, um die UTF-8-Codierung für URLs in Firefox zu aktivieren.
Geben Sie "about: config" in die Adressleiste ein.
Verwenden Sie den Filtereingabetyp, um nach der Eigenschaft "network.standard-url.encode-query-utf8" zu suchen.
Die UTF-8-Codierung für URLs funktioniert standardmäßig in IE6 / 7/8 und Chrome.
quelle
Frühere Antworten haben mit meinem Problem nicht funktioniert. Es war nur in Produktion, mit Tomcat und Apache mod_proxy_ajp. Post Körper verloren nicht ASCII Zeichen von? Das Problem war schließlich mit JVM defaultCharset (US-ASCII in einer Standardinstallation: Charset dfset = Charset.defaultCharset ();). Daher wurde die Lösung Tomcat Server mit einem Modifikator ausgeführt, um die JVM mit UTF-8 als Standardzeichensatz auszuführen:
(Fügen Sie diese Zeile zu Catalina.sh hinzu und starten Sie den Service Tomcat neu.)
Möglicherweise müssen Sie auch die Linux-Systemvariable ändern (bearbeiten Sie ~ / .bashrc und ~ / .profile für dauerhafte Änderungen, siehe https://perlgeek.de/en/article/set-up-a-clean-utf8-environment ).
quelle
Ich habe ein ähnliches Problem, aber in Dateinamen einer Datei komprimiere ich mit Apache Commons. Also habe ich es mit diesem Befehl gelöst:
es funktioniert sehr gut für mich. Hoffe es hilft jemandem;)
quelle
Für den Fall, dass Unicode-Zeichen aus Nachrichtenpaketen angezeigt werden, muss der Abschnitt "JSP-Seitencodierung" nicht angewendet werden, um Unicode auf meiner JSP-Seite anzuzeigen. Ich brauche nur den Abschnitt "CharsetFilter".
quelle
Ein weiterer Punkt, der nicht erwähnt wurde, betrifft Java-Servlets, die mit Ajax arbeiten. Ich habe Situationen, in denen eine Webseite utf-8-Text vom Benutzer aufnimmt, der diesen an eine JavaScript-Datei sendet, die ihn in einem an das Servlet gesendeten URI enthält. Das Servlet fragt eine Datenbank ab, erfasst das Ergebnis und gibt es als XML an die JavaScript-Datei zurück, die es formatiert und die formatierte Antwort in die ursprüngliche Webseite einfügt.
In einer Web-App folgte ich den Anweisungen eines frühen Ajax-Buches zum Einpacken des JavaScript beim Erstellen des URI. Das Beispiel in dem Buch verwendete die Escape () -Methode, die ich (auf die harte Tour) entdeckt habe, ist falsch. Für utf-8 müssen Sie encodeURIComponent () verwenden.
Heutzutage scheinen nur wenige Leute ihren eigenen Ajax zu rollen, aber ich dachte, ich könnte das genauso gut hinzufügen.
quelle
Über
CharsetFilter
in @kosoant Antwort erwähnt ....Es gibt einen
Filter
eingebauten Katerweb.xml
(befindet sich inconf/web.xml
). Der Filter wird benanntsetCharacterEncodingFilter
und standardmäßig kommentiert. Sie können dies auskommentieren (Bitte denken Sie daran, es auch zu kommentierenfilter-mapping
)Es ist auch nicht erforderlich,
jsp-config
in Ihremweb.xml
(ich habe es für Tomcat 7+ getestet)quelle
Einige Zeit können Sie das Problem mit dem MySQL Administrator-Assistenten lösen. Im
und setze Def. char Set: utf8
Möglicherweise muss diese Konfiguration MySQL neu starten.
quelle
Das gleiche Problem trat bei Spring MVC 5 + Tomcat 9 + JSP auf.
Nach der langen Forschung kam zu einer eleganten Lösung ( keine Notwendigkeit , Filter und keine Notwendigkeit , Änderungen in der Tomcat server.xml (ab 8.0.0-RC3 Version))
Legen Sie in der WebMvcConfigurer-Implementierung die Standardcodierung für messageSource fest (zum Lesen von Daten aus Nachrichtenquelldateien in der UTF-8-Codierung.
In der DispatcherServletInitializer-Implementierung @Override die onStartup-Methode und legen Sie die Anforderungs- und Ressourcenzeichencodierung fest.
Speichern Sie alle Nachrichtenquellen und zeigen Sie Dateien in UTF-8-Codierung an.
Fügen Sie <% @ page contentType = "text / html; charset = UTF-8"%> oder <% @ page pageEncoding = "UTF-8"%> in jede * .jsp-Datei ein oder fügen Sie jsp-config deskriptors zu web.xml hinzu
quelle
Falls Sie im Verbindungspool (mysql-ds.xml) angegeben haben, können Sie die Verbindung in Ihrem Java-Code wie folgt öffnen:
quelle