# Konvertieren UTF8 > ISO-8859-1 bei SocketStreams



## Nervensache (26. Februar 2010)

Hallo zusammen,

seit Stunden durchsuche ich schon das Netz nach einer Lösung für mein Problem. 
Leider bisher absolut erfolglos. Konvertieren von Strings von UTF-8 nach ISO-8859-1
und vice versa ist an sich ja kein Problem. Ein simples utf = new String(latinBytes, "ISO-8859-1")
genügt um den Text umzuwandeln. Alternatv habe ich es auch schon mit:


```
Charset charset = Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharsetEncoder encoder = charset.newEncoder(); 
				
ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(s));
CharBuffer cbuf = decoder.decode(bbuf);
s = s.toString();
```
 probiert.

Scheinbar lässt sich das aber nicht problemlos auf Streams übertragen. Mein Problem ist, dass 
mir der Client erst im Header verrät welche Kodierung er vornimmt. Standardmäßig setze ich UTF-8 als 
Charset für meinen InputStreamReader. Wenn ich jetzt den Text "täst" übertrage wird das leider von Java als 
"t?st" ausgegeben.  Wenn ich jetzt probiere das mit obigen Codesnippet zu konvertieren, dann gibt
mir Java als Ergebnis "týst" aus.

Die empfangenen Bytes (im Modus UTF-8) sind hierbei:
116, 65533, 115, 116  bzw  74, fffd, 73, 74


Wenn ich den StreamReader mit dem Charset "ISO-8859-1" erzeuge, wird alles wie gewünscht übertragen.
Das Charset während der Kommunikation zu wechseln scheint leider nicht möglich.

Kennt jemand eine Lösung ?


----------



## saftmeister (27. Februar 2010)

Hi,

klingt zwar wie pfusch, aber warum überschreibst du deine Stream-Reader nicht einfach mit einer neuen Instanz?

Also so ungefähr:


```
/* Ob Client oder Server ist hier ja erstmal egal */
    Socket socket = new Socket();
    try
    {
      InputStreamReader reader = new InputStreamReader(socket.getInputStream());
      
      /* Encoding-Länge müsste spezifiziert werden, oder im Header nach der Charset-Angabe suchen */
      char encoding[] = new char[20];
      reader.read(encoding, 0, encoding.length);
      
      Charset charset = Charset.forName(new String(encoding));
      
      reader = new InputStreamReader(socket.getInputStream(), charset);
      /* Ab jetzt hast du den Reader inkl. dem gewünschten Client-Encoding */
    }
    catch (IOException e)
    {
      System.out.println(e.getMessage());
    }
```


----------

