Jan K.: Tomcat: Umlaute falsch

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

Umlaute werden falsch angezeigt

akzeptierte Antworten

  1. Hat jemand von euch eine Tipp für mich wie ich die Umlaute korrekt angezeigt bekomme, bzw. UTF-8 "einschalte"?

    • Sieht aus wie UTF-8 welches als Win-1252 dargestellt wird.
    • Sieht aber auch so aus, als würde Dein Tomcat keine Angabe zur Kodierung des Outputs mitsenden. Wobei ich das nicht genau sagen kann. Denn der Statuscode 304 im "Response-Header" besagt, dass die Daten aus dem Browser-Cache stammen.

    ToDo: Mach einen Hardcore-Reload und zeige uns die Header.

    1. ToDo: Mach einen Hardcore-Reload und zeige uns die Header.

      Mit Strg+F5 den Cache gelöscht, selbes Problem:

      Bildbeschreibung

      1. Tach!

        Mit Strg+F5 den Cache gelöscht, selbes Problem: Bildbeschreibung

        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.

        1. 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 :) Bildbeschreibung

          1. 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.

  2. 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.