# Encoding problem



## CHAOSFISCH (21. Aug 2011)

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.

```
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


----------



## Kevin94 (21. Aug 2011)

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


----------



## CHAOSFISCH (21. Aug 2011)

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"


----------



## CHAOSFISCH (22. Aug 2011)

Kann mir hier wirklich niemand helfen?!


----------



## Landei (22. Aug 2011)

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.


----------



## CHAOSFISCH (22. Aug 2011)

Landei hat gesagt.:


> 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


----------



## Landei (22. Aug 2011)

CHAOSFISCH hat gesagt.:


> Was verstehst du unter Format?


Das Format vom XML. Ist es fest vorgegeben, oder hast du da einen Spielraum?


----------



## CHAOSFISCH (22. Aug 2011)

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.


----------



## CHAOSFISCH (22. Aug 2011)

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!?


----------



## Camino (22. Aug 2011)

Hmm, Encoding bei Netbeans richtig eingestellt? Ist mir bei Eclipse schon paarmal passiert...


----------



## CHAOSFISCH (22. Aug 2011)

Camino hat gesagt.:


> 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?


----------



## jgh (22. Aug 2011)

versuch mal:

```
System.setProperty("file.encoding", "UTF-8");
```


----------



## CHAOSFISCH (23. Aug 2011)

jgh hat gesagt.:


> versuch mal:
> 
> ```
> 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


----------



## Kevin94 (23. Aug 2011)

Mach dir ne Startklasse in das Archiv:

```
public static void main(String[] args)
{
    Runtime.getRuntime().exec("java -classpath deinfile.jar -Dfile.encoding=UTF8 Startklasse");
}
```


----------



## CHAOSFISCH (23. Aug 2011)

Kevin94 hat gesagt.:


> Mach dir ne Startklasse in das Archiv:
> 
> ```
> public static void main(String[] args)
> ...



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.


----------



## CHAOSFISCH (23. Aug 2011)

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!


----------



## CHAOSFISCH (23. Aug 2011)

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


----------



## Gasssst (23. Aug 2011)

Wie wärs wenn du einfach beim Schreiben der XML Datei die Kodierung richtig setzt?

PS: deine convert() method ist übrigens blödsinn...


----------



## CHAOSFISCH (23. Aug 2011)

Gasssst hat gesagt.:


> 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.
Ich hab die Klasse eh schon gestern wieder gelöscht.


----------



## Gassst (23. Aug 2011)

CHAOSFISCH hat gesagt.:


> Das mit der XML bringt garnichts, wenn die Inputdaten schon kaputt sind.


 Du hast doch gesagt die Daten aus der Datenbank sind in Ordnung:



CHAOSFISCH hat gesagt.:


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


----------



## CHAOSFISCH (23. Aug 2011)

Gassst hat gesagt.:


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


----------



## Gassst (23. Aug 2011)

CHAOSFISCH hat gesagt.:


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


----------



## CHAOSFISCH (23. Aug 2011)

Der Fehler liegt im Input der Daten.

Aber vollkommen egal, ich habe es ja schon gelõst.
Ich erzwinge nun UTF-8


----------

