Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

Java ist auch eine Insel von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 5 (Tiger-Release)
Buch: Java ist auch eine Insel
gp Kapitel 4 Der Umgang mit Zeichenketten
  gp 4.1 Strings und deren Anwendung
    gp 4.1.1 String-Objekte für konstante Zeichenketten
    gp 4.1.2 String-Länge
    gp 4.1.3 Gut, dass wir verglichen haben
    gp 4.1.4 String-Teile extrahieren
    gp 4.1.5 Suchen und Ersetzen
    gp 4.1.6 Veränderte Strings liefern
    gp 4.1.7 Unterschiedliche Typen in Zeichenketten konvertieren
  gp 4.2 Veränderbare Zeichenketten mit StringBuffer/StringBuilder
    gp 4.2.1 Anlegen von StringBuffer-Objekten
    gp 4.2.2 Die Länge eines StringBuffer-Objekts lesen und setzen
    gp 4.2.3 Daten anhängen
    gp 4.2.4 Zeichen(folgen) setzen, erfragen, löschen und umdrehen
  gp 4.3 Vergleiche von Zeichenketten
    gp 4.3.1 equals() in String und StringBuffer
    gp 4.3.2 Sollte es ein equals() und hash() bei StringBuffer geben?
    gp 4.3.3 Sprachabhängiges Vergleichen mit der Collator-Klasse
    gp 4.3.4 Effiziente interne Speicherung für die Sortierung
  gp 4.4 Zeichenkodierungen
    gp 4.4.1 Standard-Encodings
    gp 4.4.2 Base64-Kodierung
  gp 4.5 Reguläre Ausdrücke
  gp 4.6 Zerlegen von Zeichenketten
    gp 4.6.1 StringTokenizer
    gp 4.6.2 Splitten von Zeichenketten mit split() aus Pattern
    gp 4.6.3 split() in String
    gp 4.6.4 Die neue Klasse Scanner
    gp 4.6.5 Der BreakIterator als Wort- und Satztrenner
  gp 4.7 Formatieren von Ausgaben
    gp 4.7.1 Prozente, Zahlen und Währungen ausgeben mit NumberFormat
    gp 4.7.2 Ausgaben formatieren mit MessageFormat
    gp 4.7.3 Dezimalzahlformatierung mit DecimalFormat
    gp 4.7.4 Formatieren mit format()


Galileo Computing

4.4 Zeichenkodierungen  downtop

Zeichen sind in Java immer in Unicode kodiert, und ein String ist eine Folge von Zeichen. Wollen wir diese Zeichenkette etwa in eine Datei schreiben, so kann es bei Zeichen, die nicht im ASCII-Code enthalten sind, zu Problemen kommen. Die Unicode-Strings können daher umkodiert werden.


Galileo Computing

4.4.1 Standard-Encodings  downtop

Die String-Klasse bietet daher die Methode getBytes(String encoding) an, die den String in eine spezielle Kodierung umwandeln kann. Eine Übersicht der verfügbaren Kodierungen (engl. encodings) ist unter http://java.sun.com/j2se/1.5.0/docs/guide/intl/locale.doc.html zu finden. Die Kodierung, die den alten IBM-Zeichensatz bezeichnet, könnte etwa »Cp850« heißen. Die Windows-NT-Konsole nutzt zum Beispiel dieses Format. Für den alten EBCDIC-Zeichensatz ist die Codepage »Cp037«. Die Kodierung übernehmen unterschiedliche Klassen, die auch etwa vom Dienstprogramm native2ascii benutzt werden. Die Klasse OutputStreamWriter erzeugt einen neuen Datenstrom mit einer neuen Kodierung.


Beispiel   Abschließend soll ein Beispiel mit einem OutputStreamWriter-Objekt gezeigt werden, das die Codepage 850 verwendet, damit auch unter der DOS-Konsole die Umlaute korrekt erscheinen.

Listing 4.2   GetBytesConverter.java


import java.io.*;

public class GetBytesConverter
{
  public static void main( String args[] )
  {
    try
    {
      System.out.println( "Ich kann Ä Ü Ö und ß" );

      PrintWriter out = new PrintWriter(
        new OutputStreamWriter(System.out, "Cp850") );

      out.println( "Ich kann Ä Ü Ö und ß" );
      out.flush();
    }
    catch ( UnsupportedEncodingException e ) {
      System.err.println(e); }
  }
}


Galileo Computing

4.4.2 Base64-Kodieruntoptop

Für die Übertragung von Binärdaten im Internet hat sich die Base64-Kodierung durchgesetzt. Die im RFC 1521 beschriebene Methode übersetzt ein Byte, welches ja aus 8 Bit besteht, in 6-Bit-Buchstaben, was reines ASCII ist. Da nun aber zwei Byte fehlen, werden die in einem anderen Zeichen kodiert. Allerdings gibt es jetzt nicht 2 Bits in einem extra Zeichen, sondern der größte gemeinsame Teiler von 6 und 8 wird gesucht, das ist 24. Also können 3 Ausgangszeichen in 4 Base64-kodierte Zeichen umgesetzt werden. Binärdaten werden also rund 33  % länger.

Für die Kodierung gibt es in der Java-Bibliothek von Sun zwar Unterstützung, aber nicht ganz legal: Die Kodierer liegen im Paket sun.misc. Wem das nicht ganz geheuer ist, kann unter http://jakarta.apache.org/commons/codec/ die Commons-Bibliothek beziehen.

Das Beispiel mit den Sun-Klassen erzeugt zuerst ein Bytefeld mit 200 Zufallsbytes. Sie werden in ein String kodiert, der auf dem Bildschirm ausgegeben wird. Nachdem der String wieder zurückkodiert wird, werden die Bytefelder verglichen und liefern natürlich true. Da die Java-Bibliothek leider über keine direkte Funktion zum Vergleich von Bytefeldern verfügt, müssen wir über einen Trick gehen: Wir bauen erst ByteBuffer-Objekte auf, und vergleichen dann über die equals()-Funktion.

Listing 4.3   Base64Demo.java


import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Random;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Base64Demo
{
  public static void main( String[] args ) throws IOException
  {
    byte bytes1[] = new byte[200];
    new Random().nextBytes( bytes1 );

    // buf in String

    String s = new BASE64Encoder().encode( bytes1 );
    System.out.println( s );

    // Zum Beispiel:

// KWB6vmM/nk3CrP8S2keDrty8pCZGnOueEuR0zOYqeGNJrF8CSpo79t9JcVBKy30laAXwVmnJ+/mV
// MdplnXHhKe+6VqGKXW76ksiJKbDx5poIkP2LJ9d8JPg7tKTQPUY4ROQt0S8SekbE5xhfR2rYhM7K
// k9Qs37tvH+MuuCnlEvrj4H6jqIrSl/R9nYVM5pfegZe10M32phXCg0axl1sPPF7kxsxLKy5Yslcx
// j3/V6+kbjhHqfn/rg+s9A/HPN/NauYd3m87CaDA=

    // String in byte[]

    byte bytes2[] = new BASE64Decoder().decodeBuffer( s );

    boolean isEqual = ByteBuffer.wrap(bytes1).equals( ByteBuffer.wrap(bytes2) );
    System.out.println( isEqual );    // true
  }
}




Copyright © Galileo Press GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de