# Charset Umwandlung in Servlet und XML



## Jungspund (11. September 2012)

Hallo,

ich habe folgendes Problem:
Ich erstelle per Servlet eine SQL Abfrage auf eine Datenbank, diese gebe ich dann per xml an eine jsp Seite wieder.
Soweit klappt auch eigentlich alles, bis auf den Punkt, dass es Fehler bei der wiedergabe der xml gibt, sobald diese Umlaute oder ein scharfes s(ß) enthält.


```
response.setContentType("text/xml");
            response.setCharacterEncoding("ISO-8859-1");
            response.getWriter().println("<tickets>");
            if(laenge > 0) {
                response.getWriter().println("<ticket>");
                    response.getWriter().println("<me_id>"+ rs.getString(1)+"</me_id>");
                    response.getWriter().println("<me_da>"+ rs.getString(2)+"</me_da>");
                    response.getWriter().println("<ge_am>"+ rs.getString(3)+"</ge_am>");
                    response.getWriter().println("<sach>" + rs.getString(4)+"</sach>");
                    response.getWriter().println("<mo_be>"+ rs.getString(5)+"</mo_be>");
                    response.getWriter().println("<pr_nr>"+ rs.getString(6)+"</pr_nr>");
                    response.getWriter().println("<pr_be>"+ rs.getString(7)+"</pr_be>");
                    response.getWriter().println("<me_st>"+ rs.getString(8)+"</me_st>");
                    response.getWriter().println("<me_st_bez>"+ rs.getString(9)+"</me_st_bez>");
                response.getWriter().println("</ticket>");
            }
            
            for(int i=1;rs.next();++i) {
                response.getWriter().println("<ticket>"); 
                    response.getWriter().println("<me_id>"+ rs.getString(1)+"</me_id>");
                    response.getWriter().println("<me_da>"+ rs.getString(2)+"</me_da>");
                    response.getWriter().println("<ge_am>"+ rs.getString(3)+"</ge_am>");
                    response.getWriter().println("<sach>" + rs.getString(4)+"</sach>");
                    response.getWriter().println("<mo_be>"+ rs.getString(5)+"</mo_be>");
                    response.getWriter().println("<pr_nr>"+ rs.getString(6)+"</pr_nr>");
                    response.getWriter().println("<pr_be>"+ rs.getString(7)+"</pr_be>");
                    response.getWriter().println("<me_st>"+ rs.getString(8)+"</me_st>");
                    response.getWriter().println("<me_st_bez>"+ rs.getString(9)+"</me_st_bez>");
                response.getWriter().println("</ticket>");
                
            }
```

wenn ich in dem java Code hier drüber das setCharacterEncoding auf UTF-8 stelle, werden die Umlaute, so denke ich es, richtig dargestellt, da in der Abfrage erst an späterer Stelle ein Fehler auftritt. Aber weiterhin besteht das Problem mit dem scharfen s.

noch kurz die Abfrage für die XML


```
$('#allTickets').click(function(){
        if(window.XMLHttpRequest) {
            //clearTable();
            //addRow(['a','b','c','d','e','f','g','h','i']);
            // Es wird ein POST an die DB gegeben und die von ihr wiedergegebene XML ausgewertet
            $.post("all",{},function(xml){
                
                $(xml).find('ticket').each(function(){
                    alert("test");
                });
            });
        }
        else {
            alert("Bitte aktualisieren sie ihren Browser");
        }    
    });
```

wenn er an dieser Stelle die Daten auswertet, entsteht folgender Fehler, wenn die Umlaute erkannt werden:


```
XML-Verarbeitungsfehler: nicht wohlgeformt
Zeile Nr. 11, Spalte 38:
<me_st_bez>Erledigt - Handhabung erkl?rt</me_st_bez>
```

wenn ich nun das Encoding im Javaservlet für die xml auf UTF-8 stelle, werden Umlaute wahrscheinlich erkannt, aber es kommt zu folgendem Fehler:


```
XML-Verarbeitungsfehler: nicht wohlgeformt
Zeile Nr. 17, Spalte 26:
<sach>Herrn Fu?xmann</sach>
```

Die ganzen Fehler lass ich mir per Firebug anzeigen.
Nun zu meiner Frage, wie muss die Codierung richtig sein, damit alles richtig dargestellt wird?
Die jsp Seite arbeitet zur Zeit mit dem Charset "ISO-8859-1", aber auch mit "UTF-8" hat es nicht funktioniert.

sobald ich den XML response per Firebug öffnen möchte kommt auch noch folgener Fehler:


```
Die Zeichenkodierung des Reintext-Dokuments wurde nicht deklariert. Das Dokument wird in manchen Browser-Konfigurationen mit verstümmeltem Text dargestellt, wenn das Dokument Zeichen außerhalb des US-ASCII-Bereichs enthält. Die Zeichenkodierung der Seite muss im Transferprotokoll deklariert werden oder die Datei muss eine Byte-Order-Markierung als Kodierungssignatur verwenden.
```

So hab nun mit diversen Umformatierungen ein halbwegs gutes Ziel erreicht, doch nun find ich grad den byte Wert für das Kaufmännische und nicht, da mir dieses in der XML noch Probleme bereitet. Der folgende Code sollte doch Theoretisch das Kaufmännische im String durch ein &amp; ersetzen?

```
for(int i = 0;i<9;++i) {
                    if(rs.getString(i+1) != null) {
                        byte[] bytes = rs.getString(i+1).getBytes(Charset.forName("ISO-8859-1"));
                        for(int j = 0;j<bytes.length;++j) {
                            auswertung[i] += (bytes[j] == 38) ? "&amp;":bytes[j];
                        } 
                    }
                }
```

Ok dummheitsfehler, so ist´s richtig


```
String[] auswertung = new String[9];
for(int i = 0;i<9;++i) {
     if(rs.getString(i+1) != null) {
          String chars = rs.getString(i+1);
                 for(int j = 0;j<chars.length();++j) {
                       auswertung[i] += (chars.charAt(j) == 38) ? "&amp;":chars.charAt(j); 
                 }
          System.out.println(auswertung[i]);
     }
                    
}
```

ist noch zu früh morgens


----------

