Tomcat: Umlaute falsch
Jan K.
- java
- unicode
- webserver
Hallo liebes Forum.
Ich brauche euren Rat, ich stehe auf dem Schlauch. Umlaute in einer Textdatei4 auf meinem Tomcat123 werden falsch angezeigt*5.
Hat jemand von euch eine Tipp für mich wie ich die Umlaute korrekt angezeigt bekomme, bzw. UTF-8 "einschalte"?
Gruß aus Berlin, Jan
*1 Systeminfo:
OS: Ubuntu 16.04 LTS 64Bit
Webserver: Tomcat 9
Java: JDK 8 64-Bit
*2 Relevante Environment-Variablen
declare -x CATALINA_OPTS="-Dfile.encoding=UTF-8"
declare -x JAVA_HOME="/opt/jdk1.8.0_101/"
declare -x JRE_HOME="/opt/jdk1.8.0_101/jre"
declare -x LANG="de_DE.UTF-8"
declare -x LANGUAGE="de_DE"
declare -x PATH="/opt/jdk1.8.0_101//bin:/opt/jdk1.8.0_101//bin:/opt/jdk1.8.0_101//bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
*3 URIEncoding in ..apache-tomcat-9.0.0.M11/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
URIEncoding="UTF-8"
connectionTimeout="20000"
redirectPort="8443" />
*4 Die problematische UTF-8-Datei
user@ubuntu:~/Downloads/apache-tomcat-9.0.0.M11/webapps/ROOT$ cat ./foo.txt
Ölsand
Oelsand
user@ubuntu:~/Downloads/apache-tomcat-9.0.0.M11/webapps/ROOT$ file ./foo.txt
./foo.txt: UTF-8 Unicode text
*5 Das Egebnis: falsch angezeigte Umlaute
Hat jemand von euch eine Tipp für mich wie ich die Umlaute korrekt angezeigt bekomme, bzw. UTF-8 "einschalte"?
ToDo: Mach einen Hardcore-Reload und zeige uns die Header.
ToDo: Mach einen Hardcore-Reload und zeige uns die Header.
Mit Strg+F5 den Cache gelöscht, selbes Problem:
Tach!
Mit Strg+F5 den Cache gelöscht, selbes Problem:
Du bekommst eine Antwort mit Content-Type:text/plain und da hängt keine Angabe zur verwendeten Kodierung dran. Der Browser rät sich nun eins und rät da wohl falsch.
dedlfix.
Re.
Du bekommst eine Antwort mit Content-Type:text/plain und da hängt keine Angabe zur verwendeten Kodierung dran. Der Browser rät sich nun eins und rät da wohl falsch.
Das hat mich auf die Lösung gebracht: "Wie sage ich dem Tomcat statische Dokumente mit der Kodierung UTF-8 auszuliefern?"
Die Antwort hat Google geliefert: Mit einem CharsetFilter12
Besten Dank fürs Helfen :)
*1 Die Filterklasse
package weblogic;
import javax.servlet.*;
import java.io.IOException;
/**
* http://stackoverflow.com/questions/138948/how-to-get-utf-8-working-in-java-webapps
*/
public class CharsetFilter implements Filter {
private String encoding;
public void init(FilterConfig config) throws ServletException {
encoding = config.getInitParameter("requestEncoding");
if (encoding == null) encoding = "UTF-8";
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain next)
throws IOException, ServletException {
// Respect the client-specified character encoding
// (see HTTP specification section 3.4.1)
if (null == request.getCharacterEncoding()) {
request.setCharacterEncoding(encoding);
}
// Set the default response content type and encoding
response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
next.doFilter(request, response);
}
public void destroy() {
}
}
*2 web.xml: verweis auf Filterklasse + jsp-config
<!--CharsetFilter start-->
<filter>
<filter-name>CharsetFilter</filter-name>
<filter-class>weblogic.CharsetFilter</filter-class>
<init-param>
<param-name>requestEncoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>
*3 Mit dem CharsetFilter passt die Ausgabe :)
Boah!
Wenn ich diesen enormen Aufwand für die Auslieferung mit Angabe der Kodierung sehe, dann frage ich mich recht ernsthaft, welchen Vorteil ein Tomcat eigentlich bieten soll. Hauptsache "Java" und "XML"?
Hint: Ich habe gerade ein 4-Tage-Training "Java Grundlagen" hinter mir. Übrigens als Trainer.
Tach!
Hat jemand von euch eine Tipp für mich wie ich die Umlaute korrekt angezeigt bekomme, bzw. UTF-8 "einschalte"?
Da kann man nichts "einschalten" und dann läuft das. Das Grundprinzip ist, dass man a) die Daten in der gewünschten Kodierung speichern muss, und b) bei Übertragung in ein anderes System diesem die Kodierung mitteilen muss. Und das lückenlos für jeden einzelnen Schritt der Verarbeitungskette, inklusive Datenbank und anderem Backend.
dedlfix.