1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Konvertieren UTF8 > ISO-8859-1 bei SocketStreams

Dieses Thema im Forum "Java" wurde erstellt von Nervensache, 26. Februar 2010.

  1. Nervensache

    Nervensache Grünschnabel

    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:

    Code (Text):
    1. Charset charset = Charset.forName("ISO-8859-1");
    2. CharsetDecoder decoder = charset.newDecoder();
    3. CharsetEncoder encoder = charset.newEncoder();
    4.                
    5. ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(s));
    6. CharBuffer cbuf = decoder.decode(bbuf);
    7. 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 ? :confused:
    Zuletzt bearbeitet: 26. Februar 2010
  2. saftmeister

    saftmeister Nutze den Saft! Premium-User

    Hi,

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

    Also so ungefähr:

    Code (Java):
    1.  
    2.     /* Ob Client oder Server ist hier ja erstmal egal */
    3.     Socket socket = new Socket();
    4.     try
    5.     {
    6.       InputStreamReader reader = new InputStreamReader(socket.getInputStream());
    7.      
    8.       /* Encoding-Länge müsste spezifiziert werden, oder im Header nach der Charset-Angabe suchen */
    9.       char encoding[] = new char[20];
    10.       reader.read(encoding, 0, encoding.length);
    11.      
    12.       Charset charset = Charset.forName(new String(encoding));
    13.      
    14.       reader = new InputStreamReader(socket.getInputStream(), charset);
    15.       /* Ab jetzt hast du den Reader inkl. dem gewünschten Client-Encoding */
    16.     }
    17.     catch (IOException e)
    18.     {
    19.       System.out.println(e.getMessage());
    20.     }
    21.  

Diese Seite empfehlen