Encoding problem

CHAOSFISCH

Bekanntes Mitglied
Folgendes:
Daten werden über ein GUI eingegeben, landen in der Datenbank, werden aus der DB gelesen in XML verpackt und per HTTP Request abgeschickt.

Problem:
Laufende Anwendung in Netbeans => keine Encoding Fehler
Deployte Anwendung => falsches Encoding des generierten XML Inhaltes.

Beispiel:
►►► TRÄNEN UND SPEICHEL
??? TR�NEN UND SPEICHEL

Was wurde bereits versucht:
Die entsprechenden Stellen werden mit UTF8Converter.convert() (siehe unten) versucht in UTF8 zu bringen.
Java:
public class UTF8Converter {

    public static String convert(String input) {
        String output = null;
        try {
            byte[] utf8 = input.getBytes("UTF-8");
            output = new String(utf8, "UTF-8");
        } catch (UnsupportedEncodingException e) {
        }
        return output;
    }
}

=> Kein erfolg.

2. Versuch einen DB Fehler beim Eintragen auszuschließen:
Hab also von beiden HSQLDBs die script files angeschaut und gesehen, dass bei beiden es richtig drinnen steht:
"\u25ba\u25ba\u25ba TR\u00c4NEN UND SPEICHEL"

Kann es hier dennoch irgendwo beim auslesen zu einem Fehler kommen!?

3. Unmittelbar vor dem absenden der Daten wird eine Logfile erzeugt:
Diese zeigen folgendes:
►►► TRÄNEN UND SPEICHEL
??? TRÄNEN UND SPEICHEL

Auffällig: Obwohl die Daten versucht wurden zu "konvertieren", sind sie hier falsch, das Ä ist aber korrekt.

Kann ich sonst noch irgendwo nach dem Fehler suchen?

Gruß
CHAOSFISCH
 
Wo sollen die Daten hingeschickt werden/welche Art von Programm empfängt die XML daten?

Fragst du damit über ein Socket eine Website ab?
Antortest du auf eine Anfrage an ein Servlet?

Wenn du allgemein im WWW daten verschickst muss im Header entweder die Zeichencodierung angegeben sein oder du musst ASCII verwenden und all nicht ASCII zeichen mit HTML Entities maskieren.
Die deutschen Umlaute bilden bei den meisten Browsern eine Ausnahme, die werden manchmal auch so erkannt (Frag mich nicht warum, ist mir nur mal aufgefallen).
 
Es handelt sich um einen Google Data Api Request.
Selbstverständlich befindet sich in der XML Datei encoding="utf-8" und im Header charset="utf-8"
 
Vielleicht eine dumme Idee, aber wenn du Kontrolle über das Format hast und es nur ein bestimmtes Feld betrifft, nimm doch einfach Base64, bevor du dich ewig damit rumärgerst.
 
Vielleicht eine dumme Idee, aber wenn du Kontrolle über das Format hast und es nur ein bestimmtes Feld betrifft, nimm doch einfach Base64, bevor du dich ewig damit rumärgerst.

Was verstehst du unter Format? Varchar?
Weil soweit ich das sehe, hilft mir Base64 nicht weiter.
Es ist alles in der DB korrekt drinnen, es kann alles wieder in das GUI richtig ausgelesen werden.
Aber sobald ich die Daten dann in einer Datei abspeichere / XML daraus erstelle sind sie falsch :O
 
Zuletzt bearbeitet:
Ich hab absolut keinen Spielraum!
Google will ein atom+xml als Contenttype.

Was ich nicht verstehe:

Läuft es in Netbeans funktioniert es
Läuft es dann später als ausgeführte .jar File, dann gibts Probleme.
 
So, ich habe nun ein paar neue Informationen zu dem Problem:

Die Input Daten werden anscheinend schon beim Input durch das GUI falsch behandelt.
Kann man irgendwie explizit sagen, welches Encoding ein JTextfield etc. haben muss!?
 
Hmm, Encoding bei Netbeans richtig eingestellt? Ist mir bei Eclipse schon paarmal passiert...

Hab unter Projekteinstellungen UTF-8 gesetzt gehabt.
In Netbeans läuft es problemlos.
In Windows als fertige jar Datei gibts das Problem.
Vermutlich wird das standard char. encoding cpXXXX genommen.

Ich hab nun die bestätigung, dass in Netbeans Charset.defaultCharset = utf8
Unter Windows leider = windows-12xx

Edit:
Genau das ist das Problem jetzt.
Ich kann zwar jetzt den Parameter -Dfile.encoding=UTF8 anhängen, kann ich das aber auch irgendwie fest eincompilieren?
 
Zuletzt bearbeitet:
versuch mal:
Java:
System.setProperty("file.encoding", "UTF-8");

Wenn es so einfach wäre.
file.encoding kann nicht verändert werden innerhalb einer Anwendung.
file.encoding muss spätestens beim Start der JVM festgelegt sein.
Darum fragte ich auch, ob man das irgendwie (das Argument -Dfile.encoding=UTF8) fest in die Datei eincompilieren kann.

Gruß
CHAOSFISCH
 
Mach dir ne Startklasse in das Archiv:
Java:
public static void main(String[] args)
{
    Runtime.getRuntime().exec("java -classpath deinfile.jar -Dfile.encoding=UTF8 Startklasse");
}
 
Mach dir ne Startklasse in das Archiv:
Java:
public static void main(String[] args)
{
    Runtime.getRuntime().exec("java -classpath deinfile.jar -Dfile.encoding=UTF8 Startklasse");
}

Dies scheint eine gute Lösung zu sein.
So ganz versteh ich zwar noch nicht wie ich es exakt einbauen muss, aber ich arbeite mal kurz dran.
 
So
wenn ichs also jetzt richtig gemacht habe:
Habe die Klasse Start erstellt, den Code von oben eingefügt und in folgendes abgeändert:
"java -classpath YoutubeUploader.jar -Dfile.encoding=UTF8 youtubeuploader.view.YoutubeUploaderApp"
YoutubeUploader.jar = das Archiv in dem auch die neu erstellte Startklasse sich befindet
youtubeuploader.view.YoutubeUploaderApp = die Klasse die auch eine main Methode enthält und die Applikation tatsächlich startet.
2. Dem Builder gesagt das die Start Klasse die "Main Klasse" ist.

Scheint jetzt zu funktionieren,
Danke!
 
So,
ich hab jetzt ein Problem mit der Ausführung:

Java meldet:
Unable to access jarfile YoutubeUploder.jar
Vorher gings. Nun irgendwie nicht mehr.

Aufruf ist wie folgt:
java -jar YoutubeUploader.jar
 
Wie wärs wenn du einfach beim Schreiben der XML Datei die Kodierung richtig setzt?

PS: deine convert() method ist übrigens blödsinn...
 
Das mit der XML bringt garnichts, wenn die Inputdaten schon kaputt sind.
Du hast doch gesagt die Daten aus der Datenbank sind in Ordnung:

Es ist alles in der DB korrekt drinnen, es kann alles wieder in das GUI richtig ausgelesen werden.
Aber sobald ich die Daten dann in einer Datei abspeichere / XML daraus erstelle sind sie falsch :O

Was denn nun? Der erste Schritt wär erstmal rauszufinden wo die Kodierung verloren geht...
 
Du hast doch gesagt die Daten aus der Datenbank sind in Ordnung:



Was denn nun? Der erste Schritt wär erstmal rauszufinden wo die Kodierung verloren geht...

Die Daten stehen in der DB richtig drinnen und gehen spätestens dann wieder beim auslesen kaputt, da String das defaultCharset von windows-1256 oder so hat.
Deswegen ist der eingabe punkt, gui oder db egal. Die Daten werden so oder so "zerstört".
 
Die Daten stehen in der DB richtig drinnen und gehen spätestens dann wieder beim auslesen kaputt, da String das defaultCharset von windows-1256 oder so hat.
Deswegen ist der eingabe punkt, gui oder db egal. Die Daten werden so oder so "zerstört".
Hä, wenn die Daten in der Datenbank richtig drinstehen warum sollten sie beim auslesen kaputt gehen?

Ein java.lang.String hat übrigens per Definition überhaupt keine Kodierung. Ansonsten weiß ich nicht wie man sonst noch helfen kann: Stell erstmal die Stelle in der Übertragungskette fest wo das Encoding verloren geht.
 

Zurück
Oben