JDBC: PSQLException Encoding

Hallo,

ich bin echt am verzfeilen.

PostgreSQL Server 8.3.6 unter RHEL mit LATIN1
Java Programm in eclipse mit dem JDBC Treiber postgresql-8.3-607.jdbc4.jar.

Ich habe alles probiert, egal was ich mache, eclipse project encoding auf “Cp1252”, “ISO-8859-1”, “UTF-8”. Testweise “props.setProperty(“compatible”,“7.1”);” und “props.setProperty(“charSet”,“LATIN1”);”. Die PSQLException gibt anstelle Umlauten nur ? aus. (Das Passwort gebe ich extra falsch ein)

“FATAL: Passwort-Authentifizierung f?r Benutzer ?test? fehlgeschlagen”

SHOW server_encoding;
 server_encoding
-----------------
 LATIN1
(1 Zeile)



SHOW client_encoding;
 client_encoding
-----------------
 LATIN1
(1 Zeile)



SHOW LC_CTYPE;
    lc_ctype
----------------
 de_DE.iso88591
(1 Zeile)

Was kann ich noch versuchen?

Gruß
Joshua

Das ist ein Problem der Einstellung deiner Konsole, nicht der Datenbank.

Das wird nicht in der Konsole ausgegeben sondern in der Java GUI. textArea.append(e.getMessage()); Es sind keine richtigen ? eher so Bauklötzchen Fragezeichen: “FATAL: Passwort-Authentifizierung f�r Benutzer �asd� fehlgeschlagen”

Nun, welches Encoding verwendet die Java GUI?

Ich kann das bestätigen. Auch wenn man die Meldung in ein UTF-8 codiertes Logfile schreibt, gehen die Umlaute verloren.

Die Java GUI benutzt das encoding welches ich im eclipse project einstelle. Aber wie gesagt weder “Cp1252”, “ISO-8859-1” oder “UTF-8” funktionieren. Es bleiben Bauklötzchen.

Gehen die verloren? Ein Logfile ist per Definition erst mal eine Datei, die kein Encoding hat.
Was dann später zu sehen ist, hängt davon ab, was das Betriebssystem darstellt.

Sind die Zeichen also im Logfile schon nicht mehr vorhanden? Kann man das mit einem z. B. Hex-Editor bestätigen?

Mein Logfile hat ein Encoding - ich mache das explizit mit UTF-8 auf.

Sind die Zeichen also im Logfile schon nicht mehr vorhanden?

Genau.

Kann man das mit einem z. B. Hex-Editor bestätigen?

Auch das.

Mit dem folgenden Program kann man das reproduzieren (vorausgesetzt lc_messages steht auf German):

public static void main(String[] args)
    throws Exception
{
    PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream("error.log"), "UTF-8"));
    out.println("Hier sind die korrekten Umlaute: öäüÖÄÜß");
    Connection con = null;
    try
    {
        con = DriverManager.getConnection("jdbc :p ostgresql://localhost:5432/postgres", "postgres", "gaga");
    }
    catch (SQLException e)
    {
        out.println(e.getMessage());
    }
    finally
    {
        if (con != null) con.close();
        out.close();
    }
}

In der Datei error.log stehen in der ersten Zeile korrekte Umlaute, die Fehlermeldung aus der Exception wird dagegen falsch geschrieben.
Ich habe verschiedene Varianten von lc_messages in postgresql.conf ausprobiert aber das scheint nichts zu ändern. (auch German_Germany.65001 da 65001 normalerweise in Windows die UTF-8 code page ist)

Ich habe versucht das Logfile (gezipped) hier anzuhängen, aber irgendwie funktioniert der Uploader nicht…

Zwei Punkte, über die ich mich wundere:

Ist das Encoding der Datenbank auch UTF8?

Bauklötzchen sind erst mal ein Problem der Ausgabe, nicht der Inhalte.
Was genau steht denn an der Stelle in der Datei? Kann dein Editor das Encoding verändern? Kannst du sehen, ob das Zeichen in einem anderen Encoding passt?

Also wenn ich bei mir castorps Code einfüge, die DB ist wie gesagt LATIN1, das eclipse project habe ich auch auf LATIN1 gestellt, und ich nutze new FileOutputStream(“error.log”), “LATIN1”). Dann stehe im error.log:

Hier sind die korrekten Umlaute: äöüß
FATAL: Passwort-Authentifizierung f?r Benutzer ?asd? fehlgeschlagen

Also keine Bauklötzchen sondern ?

In meinem Fall schon. Aber was hat das mit einer Fehlermeldung des JDBC Treibers zu tun?

Bauklötzchen sind erst mal ein Problem der Ausgabe, nicht der Inhalte.

Naja, wenn die Fehlermeldung (kein DB-Inhalt) schon vom Server falsch an den Client übermittelt wird, dann ist das schon ein Problem des Inhalts (finde ich)

Was genau steht denn an der Stelle in der Datei?

EF BF BD EF BF BD (anstatt dem ü)

Kann dein Editor das Encoding verändern? Kannst du sehen, ob das Zeichen in einem anderen Encoding passt?

Hab’s mit Notepad++, PNotepad und JEdit versucht, die Daten werden in keinem Encoding korrekt angezeigt.

Hat jemand Lust in den Source Code zu schauen, welches Encoding die Fehlermeldungen verwenden?
Sieht so aus, als ob da etwas durcheinander gerät.

Ich schau mir das am Wochenende mal…

Also ich bin das im Debugger mal durchgegangen. Das ist wohl ein Problem mit dem Treiber. Der liest Fehlermeldungen die beim Connect vom Server kommen immer mit US_ASCII ein. Klar, dass damit die Umlaute kaputt gehen.

Leider kann der Treiber vor der Verbindung zum Server natürlich nicht abfragen, was die Einstellung von lc_messages auf dem Server ist.

Ich habe das mal auf der JDBC Mailing liste geposted, mit dem Vorschlag einen Connection Parameter einzuführen mit dem der Client dem Treiber sagen kann in welchem Encoding die Meldungen kommen. Alternativ könnte der Treiber natürlich auch die Umgebungsvariable LC_MESSAGES auf dem Client auswerten.

Mal sehen, was die Entwickler so dazu sagen.

Vorläufig gibt es aber keinen Workaround.

Ich kann aber einen Treiber compilieren und hier posten (wenn ich das hier mit den Anhängen mal gebacken kriegen) der einen URL Parameter für das Encoding auswertet und entsprechend verwendet.

Gibt es schon neuigkeiten von der JDBC Mailing liste oder deinen compilier-Versuchen?

Nicht wirklich. Auf der Mailingliste habe ich eigentlich keine vernünftige Antwort bekommen. Grundsätzlich wurde mein Vorschlag mit dem Parameter als gut empfunden, aber das war’s dann auch schon.

Vielen Dank castorp, ich habe mich jetzt ein bisschen mit ant rumgeärgert und mir einen eigenen Treiber compiliert. Deine Änderung funktioniert super. Falls noch jemand interesse daran hat, es handelt sich um die Version 8.3-607, außer “newStream.setEncoding(Encoding.getDatabaseEncoding(“ISO-8859-1”));” habe ich nichts geändert.

Zippyshare.com