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

 << zurück
Java ist auch eine Insel von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 5
Java ist auch eine Insel

Java ist auch eine Insel
5., akt. und erw. Auflage
1454 S., mit CD, 49,90 Euro
Galileo Computing
ISBN 3-89842-747-1
gp Kapitel 4 Der Umgang mit Zeichenketten
  gp 4.1 Strings und deren Anwendung
    gp 4.1.1 String-Literale als String-Objekte für konstante Zeichenketten
    gp 4.1.2 String-Objekte neu anlegen
    gp 4.1.3 String-Länge
    gp 4.1.4 Gut, dass wir verglichen haben
    gp 4.1.5 String-Teile extrahieren
    gp 4.1.6 Suchen und Ersetzen
    gp 4.1.7 Veränderte Strings liefern
    gp 4.1.8 Unterschiedliche Typen in Zeichenketten konvertieren
  gp 4.2 Veränderbare Zeichenketten mit StringBuffer/StringBuilder
    gp 4.2.1 Anlegen von StringBuffer/StringBuilder-Objekten
    gp 4.2.2 Die Länge eines StringBuffer/Builder-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/StringBuilder
    gp 4.3.2 equals() und hashCode() bei StringBuffer/StringBuilder
    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 Reguläre Ausdrücke
    gp 4.4.1 Die Klassen Pattern und Matcher
    gp 4.4.2 Mit MatchResult alle Ergebnisse einsammeln
    gp 4.4.3 Das alternative Paket org.apache.regexp
  gp 4.5 Zerlegen von Zeichenketten
    gp 4.5.1 Splitten von Zeichenketten mit split() aus Pattern
    gp 4.5.2 split() in String
    gp 4.5.3 Die Klasse Scanner
    gp 4.5.4 StringTokenizer
    gp 4.5.5 Der BreakIterator als Wort- und Satztrenner
  gp 4.6 Zeichenkodierungen
    gp 4.6.1 Kodierungen für unterschiedliche Codepages
    gp 4.6.2 Andere Klassen zur Konvertierung und das Paket java.nio.charset
    gp 4.6.3 Base64-Kodierung
  gp 4.7 Formatieren von Ausgaben
    gp 4.7.1 Zahlen, Prozente und Währungen mit NumberFormat formatieren
    gp 4.7.2 Dezimalzahlformatierung mit DecimalFormat
    gp 4.7.3 Formatieren mit format() aus String
    gp 4.7.4 Ausgaben formatieren mit MessageFormat


Galileo Computing

4.6 Zeichenkodierungedowntop

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.6.1 Kodierungen für unterschiedliche Codepages  downtop

Die String-Klasse konvertiert mit der Methode getBytes(String encoding) den String in eine andere Zeichen-Kodierung, etwa vom internen Unicode in den EBCDIC-Zeichensatz der IBM-Mainframes. Sun repräsentiert jede Kodierung (engl. encodings) durch eine Zeichenfolge, die unter http://java.sun.com/j2se/1.5/docs/guide/intl/encoding.doc.html aufgeführt ist. Die Kodierung, die den alten IBM-Zeichensatz bezeichnet, heißt »Cp850«. Die Windows-NT-Konsole nutzt zum Beispiel dieses Format. Für den alten EBCDIC-Zeichensatz ist die Codepage »Cp037«.


Galileo Computing

4.6.2 Andere Klassen zur Konvertierung und das Paket java.nio.charset  downtop

Neben der Klasse String mit getBytes() unterstützen auch andere Klassen die Umkodierung. Dazu zählt die Klasse OutputStreamWriter, die als Writer die Unicode-Zeichen mit einer gewählten Kodierung in einen binären Datenstrom schreibt. Der InputStreamReader übernimmt den anderen Weg.


Beispiel   Zum korrekten Darstellen der Umlaute auf der DOS-Konsole wird ein OutputStreamWriter mit der Codepage 850 angewiesen.

Listing 4.8   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); }
  }
}

Sollen ganze Dateien umkodiert werden, lässt sich das Dienstprogramm native2ascii nutzen.

Seit Java 1.4 übernimmt das Paket java.nio.charset im Hintergrund die Kodierungen. Die statische Funktion Charset.availableCharsets() liefert eine Map<String,Charset> – mit etwa 150 Einträgen – und somit Namen und assoziierte Klassen alle angemeldeten Kodierer. Die konkreten Kodierungsklassen lassen sich aber auch per Charset.forName() erfragen.

for ( String charsetName : Charset.availableCharsets().keySet() )
{
  System.out.println( charsetName );
  Charset charset = Charset.forName( charsetName );
}

Mit dem konkreten Charset-Objekt lässt sich auf zwei Wegen weiter verfahren:

gp  Direkt mit den Methoden encode() und decode() konvertieren oder
gp  über die newDecoder() einen CharsetDecoder beziehungsweise newEncoder() einen CharsetEncoder erfragen und darüber arbeiten.

Galileo Computing

4.6.3 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 2 Bit 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, der kann unter http://jakarta.apache.org/commons/codec/ die Commons-Bibliothek beziehen.

Das nachfolgende Beispiel erzeugt zuerst ein Bytefeld der Größe 200 und belegt es mit Zufallszahlen. Sun-Klassen kodieren das Bytefeld in einen String, 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.9   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
  }
}
 << zurück




Copyright © Galileo Press GmbH 2005
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, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de