# Encodingfehler von Umlauten unter Windows Mobile 5 / Mysaifu



## sp@g (3. Dez 2008)

Hallo,

ich habe eine Programm für Windows Mobile 5 unter Mysaifu geschrieben was eine XML-Datei parst und daraus einen Vector-Tree baut. 
Bisher habe ich für das parsen den MinML verwendet. Dieser stammt aber aus dem Jahre 2001 und hatte Probleme damit Umaute unter Windows auszulesen. Ich muss dazu sagen ich arbeite mit Eclipse unter Linux und da hatte ich keine Probleme mit Umlauten. Wenn ich das Programm dann aber auf einem Windows-Rechner ausgeführt habe, kamen da nur kryptische Zeichen.

Also dachte ich mir, muss es am parser liegen und habe jetzt alles auf SAX2 umgestellt. Geht auch alles wunderbar. Auch die Umlaute werden jetzt unter Windows richtig ausgelesen.

ABER:

Der MinML steht für geringen Speicherverbrauch, was sich auf einem PDA oder Smartphone doch ganz gut macht. Beim debuggen habe ich gesehen, das das Array der Methode characters() des ContentHandlers eine Größe von etwa 200 hatte hingegen ist das Array des SAX-Parsers 2000 + x groß. Brauche ich definitiv nicht. Macht sich meiner Meinung nach auch in der Zeit des Parsvorgangs bemerktbar, da es jetzt fast doppel so lange auf dem Desktop-PC dauert und auf dem PDA geht es garnicht, weil da der Speicher irgendwann voll ist. 

Jetzt also meine Frage: Ist es irgendwie möglich die Größe dies Arrays festzulegen? Ich habe bis jetzt keine Methode gesehen. Wenn das nicht geht, wie bekomme ich dann den MinML dazu, das er auch Umlaute unter Windwos lesen kann.

Danke für eure Antworten.


----------



## Wildcard (3. Dez 2008)

Ich hatte noch nichts mit MinML zu tun, aber es scheint als würde die Bibliothek die XML Encoding Informationen im Header ignorieren und auf UTF-8 'defaulten'


----------



## sp@g (4. Dez 2008)

So, ich bin jetzt auf MinML2 umgestiegen, eine etwas neuere Version die auf SAX2 basiert, soweit ich das verstanden habe. Unter Windows XP werden jetzt auch Umlaute dargestellt nur unter Windows Mobile 5 noch nicht. 

Kann das an der VM liegen?

Deine Vermutung habe ich auch solange innerlich bestätigt bis mir zufällig bewusst wurde, das die xml-datei die ich bis jetzt immer geparst habe UTF-8 war. Also wäre es im Prinzip erstmal egal gewesen. Das kann noch als Fehler auftreten, hoffe ich aber nicht.

Na mal sehen ob mir morgen neue Ideen kommen.

Gute Nacht erstmal.


----------



## Wildcard (4. Dez 2008)

sp@g hat gesagt.:
			
		

> Deine Vermutung habe ich auch solange innerlich bestätigt bis mir zufällig bewusst wurde, das die xml-datei die ich bis jetzt immer geparst habe UTF-8 war.


Bei XML Encoding musst du unterscheiden: Das Encoding das im Header steht und das Encoding was wirklich verwendet wurde. Das ist leider nicht immer identisch.


----------



## sp@g (4. Dez 2008)

so ich hab die xml-datei jetzt als ISO endoiert und der parser wirft immer noch kryptische zeichen raus. 

So jetzt habe ich meiner Meinung nach alles versucht. 

MinML2 und SAXParser lesen eine XML-Datei mit deutschen Umlauten egal ob UTF oder ISO-Codierung falsch aus, bzw. stellen die Umlaute falsch dar. Wo ist das Problem?

Wie kann ich die Umlaute im Character-Array finden und durch /uxxxx- Zeichen ersetzten. Das ist jetzt meiner Meinung nach die letzte Möglichkeit, die ich sehe.

Ok ich werde den Fehler nochmal genauer beschreiben:

Laut wikipedia wird ein UTF-8 codiertes ä als ISO-8859-1 encodiertes Ã¤ dargestellt.
Ich habe eine XML-Datei mit allen Umlauten unter Linux geschrieben und beim Speichern UTF-8 angegeben. die Information steht aber nicht im XML-Header. Desweiteren habe ich in einer Testklasse eine Parser mit 

```
XMLReader parser = XMLReaderFactory.createXMLReader();
  parser.setContentHandler(this);
  InputSource is = new InputSource (new InputStreamReader(new BufferedInputStream(new java.io.FileInputStream("example.xml"), 512)));
  is.setEncoding("UTF-8");
  parser.parse(is);
```

erzeugt. Wenn ich diesen unter Windows XP oder Linux laufen lassen werden die Umlaute korrekt ausgelesen und auch dargestellt.
Unter Windows Mobile 5 mit Mysaifu wird aber für das ä z.Bsp.: ├ñ (wobei der Strich eigentlich unter Windows ein Viereck ist)

Jetzt schlussfolgere ich daraus, dass es nicht am falschen Encoder liegt sondern an etwas anderem, aber an was?

hier nochmal die XML-Datei

```
<SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Body>
       <SOAP-ENV:Fault>
           <faultcode>SOAP-ENV:Server</faultcode>
           <faultstring>Server Error</faultstring>
           <detail>
               <e:myfaultdetails xmlns:e="Some-URI">
                 <message>
                 	Ä Ö Ü ß ö ü ä
                 </message>
                 <errorcode>
                   1001
                 </errorcode>
               </e:myfaultdetails>
           </detail>
       </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
<t> hello [b]world[/b]!</t>
</SOAP-ENV:Envelope>
```

sowie die Ausgabe auf der Konsole abgespeichert in einer .txt

```
Start of Element: localName = "detail"
Start of Element: namespaceURI = ""
Start of Attributes
End of Attributes
Characters: "
               "
Start prefix mapping: prefix = "e" uri = "Some-URI"
Start of Element: qName = "e:myfaultdetails"
Start of Element: localName = "myfaultdetails"
Start of Element: namespaceURI = "Some-URI"
Start of Attributes
End of Attributes
Characters: "
                 "
Start of Element: qName = "message"
Start of Element: localName = "message"
Start of Element: namespaceURI = ""
Start of Attributes
End of Attributes
Characters: "
                 	├ä ├û ├£ ├ƒ ├Â ├╝ ├ñ
                 "
End of Element: qName = "message"
End of Element: localName = "message"
End of Element: namespaceURI = ""
Characters: "
                 "
Start of Element: qName = "errorcode"
Start of Element: localName = "errorcode"
Start of Element: namespaceURI = ""
Start of Attributes
End of Attributes
Characters: "
                   1001
                 "
End of Element: qName = "errorcode"
End of Element: localName = "errorcode"
End of Element: namespaceURI = ""
Characters: "
               "
End of Element: qName = "e:myfaultdetails"
End of Element: localName = "myfaultdetails"
End of Element: namespaceURI = "Some-URI"
End prefix mapping: prefix = "e"
Characters: "
           "
End of Element: qName = "detail"
End of Element: localName = "detail"
End of Element: namespaceURI = ""
Characters: "
       "
End of Element: qName = "SOAP-ENV:Fault"
End of Element: localName = "Fault"
End of Element: namespaceURI = "http://schemas.xmlsoap.org/soap/envelope/"
Characters: "
   "
End of Element: qName = "SOAP-ENV:Body"
End of Element: localName = "Body"
End of Element: namespaceURI = "http://schemas.xmlsoap.org/soap/envelope/"
Characters: "
"
Start of Element: qName = "t"
Start of Element: localName = "t"
Start of Element: namespaceURI = ""
Start of Attributes
End of Attributes
Characters: " hello "
Start of Element: qName = "b"
Start of Element: localName = "b"
Start of Element: namespaceURI = ""
Start of Attributes
End of Attributes
Characters: "world"
End of Element: qName = "b"
End of Element: localName = "b"
End of Element: namespaceURI = ""
Characters: "!"
End of Element: qName = "t"
End of Element: localName = "t"
End of Element: namespaceURI = ""
Characters: "
"
End of Element: qName = "SOAP-ENV:Envelope"
End of Element: localName = "Envelope"
End of Element: namespaceURI = "http://schemas.xmlsoap.org/soap/envelope/"
End prefix mapping: prefix = "SOAP-ENV"
End of Document
JVM exit
```

Danke.


----------



## sp@g (4. Dez 2008)

Ok,

eine einfach kurze ausgabe auf der Konsole


```
public class EncodingTest {

public static void main (final String[] args) {
	System.out.println("\u00C4\u00A0\u00D6\u00A0\u00DC\u00A0\u00DF\u00A0\u00FC\u00A0\u00F6\u00A0\u00E4");
	System.out.println("Ä Ö Ü ß ü ö ä");
	System.out.println("Test beendet");
    }
}
```

zeigt, das es kein Darstellungsfehler des Systems ist oder der JVM ist. Es liegt also meiner Ansicht nach an den Einstellungen für den Parser. Die API wie auch Google geben mir keine Hinweis darauf wie ich das Charset ändern kann und aus dem Quelltext für den MinML2 werde ich auch nicht so ganz schlau. Da sind zwar eine menge \uxxxx - Zeichen aufgeführt, aber ich kann nicht ganz nachvollziehen wann und vorallem wie er diese gebraucht. Und da es auf dem DesktopPC geht, sehe ich es nicht für notwendig da etwas daran zu ändern.

Um auf meine Anfängliche Frage zurück zu kommen, wie ich die Größe des character-Arrays festlegen kann, habe ich gelesen das es bei der Erstellung eines Readers geht. Da aber meine InputSource für den Parser aus einem

```
URLConnection.getInputSorce()
```
kommt kann ich dafür nicht die Array-Größe bestimmen.

Was wäre jetzt ein guter Ansatzpunkt für eine erneute Fehlereingrenzung?

Danke für euer Bemühungen.


----------



## sp@g (2. Jan 2009)

Nach längerem Bemühen und der ausgeprägten Hilfe in diesem Forum, habe ich einige Parser probiert und mit einander verglichen. Der MinML konnte keine deutschen Umlaute umsetzten, egal in welchem Encoding (UTF8, ISO1859) die XML-Datei vorlag.

Habe dann verschieden frei verfügbare Parser miteinander verglichen. Vergleichskriterien waren hierbei:


  Dateigöße

  Verarbeitungsgeschwindikeit / Parszeit

  Umsetzung von Umlauten





Als Ergebnis stach der Aelfred-Parser heraus, da dieser das beste Verhältnis von Dateigröße und Parzeit hat.

Danke für eure Hilfe.


----------

