Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Mathematisches
6 Eigene Klassen schreiben
7 Angewandte Objektorientierung
8 Exceptions
9 Die Funktionsbibliothek
10 Threads und nebenläufige Programmierung
11 Raum und Zeit
12 Datenstrukturen und Algorithmen
13 Dateien und Datenströme
14 Die eXtensible Markup Language (XML)
15 Grafische Oberflächen mit Swing
16 Grafikprogrammierung
17 Netzwerkprogrammierung
18 Verteilte Programmierung mit RMI und Web-Services
19 JavaServer Pages und Servlets
20 Applets
21 Midlets und die Java ME
22 Datenbankmanagement mit JDBC
23 Reflection und Annotationen
24 Logging und Monitoring
25 Sicherheitskonzepte
26 Java Native Interface (JNI)
27 Dienstprogramme für die Java-Umgebung
A Die Begleit-DVD
Stichwort
Download: - ZIP, ca. 12,5 MB
Buch bestellen
Ihre Meinung?
<< zurück | Galileo Computing / <openbook> /Java-Insel | vor >>
Java ist auch eine Insel von Christian Ullenboom Programmieren mit der Java Standard Edition Version 6
Java ist auch eine Insel 7., aktualisierte Auflage geb., mit DVD (November 2007) 1.492 S., 49,90 Euro Galileo Computing ISBN 978-3-8362-1146-8 |
| 4 Der Umgang mit Zeichenketten
|  | 4.1 Einzelne Zeichen mit der Character-Klasse behandeln
|  | 4.2 Strings und deren Anwendung
|  |  | 4.2.1 String-Literale als String-Objekte für konstante Zeichenketten
|  |  | 4.2.2 String-Länge und Test auf Leerstring
|  |  | 4.2.3 Nach enthaltenen Zeichen und Zeichenfolgen suchen
|  |  | 4.2.4 Gut, dass wir verglichen haben
|  |  | 4.2.5 String-Teile extrahieren
|  |  | 4.2.6 Strings anhängen, Groß-/Kleinschreibung und Leerraum
|  |  | 4.2.7 Suchen und ersetzen
|  |  | 4.2.8 String-Objekte mit Konstruktoren neu anlegen
|  | 4.3 Konvertieren zwischen Primitiven und Strings
|  |  | 4.3.1 Unterschiedliche Typen in Zeichenketten konvertieren
|  |  | 4.3.2 String in primitives Element konvertieren
|  | 4.4 Veränderbare Zeichenketten mit StringBuffer/StringBuilder
|  |  | 4.4.1 Anlegen von StringBuffer/StringBuilder-Objekten
|  |  | 4.4.2 Die Länge eines StringBuffer/-Builder-Objekts
|  |  | 4.4.3 Daten anhängen
|  |  | 4.4.4 Zeichen(folgen) setzen, erfragen, löschen und umdrehen
|  |  | 4.4.5 Vergleichen von String/StringBuffer/StringBuilder
|  |  | 4.4.6 hashCode() bei StringBuffer/StringBuilder
|  | 4.5 Sprachabhängiges Vergleichen und Normalisierung
|  |  | 4.5.1 Die Klasse Collator
|  |  | 4.5.2 Effiziente interne Speicherung für die Sortierung
|  |  | 4.5.3 Normalisierung
|  | 4.6 Reguläre Ausdrücke
|  |  | 4.6.1 Die Klassen Pattern und Matcher
|  |  | 4.6.2 Mit MatchResult alle Ergebnisse einsammeln
|  | 4.7 Zerlegen von Zeichenketten
|  |  | 4.7.1 Splitten von Zeichenketten mit split()
|  |  | 4.7.2 split() in Pattern
|  |  | 4.7.3 Die Klasse Scanner
|  |  | 4.7.4 StringTokenizer
|  |  | 4.7.5 BreakIterator als Zeichen-, Wort-, Zeilen- und Satztrenner
|  | 4.8 Zeichenkodierungen und Base64
|  |  | 4.8.1 Über die Klasse String Kodierungen vornehmen
|  |  | 4.8.2 Konvertieren mit OutputStreamWriter-Klassen
|  |  | 4.8.3 Das Paket java.nio.charset
|  |  | 4.8.4 Base64-Kodierung
|  | 4.9 Formatieren von Ausgaben
|  |  | 4.9.1 Formatieren mit format() aus String
|  |  | 4.9.2 Die Format-Klassen im Überblick
|  |  | 4.9.3 Zahlen, Prozente und Währungen mit NumberFormat und DecimalFormat formatieren
|  |  | 4.9.4 Ausgaben mit MessageFormat formatieren
|  | 4.10 Zum Weiterlesen
## 4.8 Zeichenkodierungen und Base64 Einzelne Zeichen sind in Java intern immer in 16 Bit Unicode kodiert, und ein String ist eine Folge der Unicode-Zeichen. Wollen wir diese Unicode-Zeichenkette in eine Datei schreiben, können mitunter andere Programme die Dateien nicht wieder einlesen, da sie kein Unicode erwarten oder damit umgehen können. Die Unicode-Strings müssen daher in unterschiedliche Codepages, etwa 8 Bit Latin-1, umkodiert werden. ### 4.8.1 Über die Klasse String Kodierungen vornehmen Die String-Klasse konvertiert mit der Methode getBytes(String charsetName) bzw. getBytes(Charset charset) den String in ein Byte-Feld mit einer bestimmten Zeichen-Kodierung. Auf diese Weise kann Java die interne Unicode-Repräsentation zum Beispiel in den EBCDIC-Zeichensatz eines IBM-Mainframes übertragen. Sun repräsentiert jede Kodierung (engl. encodings) durch eine Zeichenfolge oder ein Charset-Objekt; die Namen sind unter http://tutego.com/go/encoding aufgeführt. Für den EBCDIC-Zeichensatz ist das die Codepage »Cp037«. Die DOS-Konsole unter Windows nutzt einen veränderten IBM-Zeichensatz, dessen Codepage »Cp850« heißt.
Beispiel Kodiere den String »Vernaschen« in EBCDIC:
    try
    {
      byte[] ebcdic = "Vernaschen".getBytes( "Cp037" );
      System.out.println( Arrays.toString(ebcdic) );
      // [-27, –123, –103, –107, –127, –94, –125, –120, –123, –107]
    }
    catch ( UnsupportedEncodingException e ) { ... }
Zur Kodierung in die andere Richtung, also von einem Bytefeld in einen Unicode-String, ist der Konstruktor von String mit der Kodierung zu nutzen. Auch hier kann eine UnsupportedEncodingException folgen, wenn es die Kodierung nicht gibt.
Beispiel Kodiere das Bytefeld mit den Zeichen nach dem EBCDIC-Alphabet zurück in einen String:
    byte[] ebcdic = "Vernaschen".getBytes( "Cp037" );
    String s = new String( ebcdic, "Cp037" );
    System.out.println( s );                  // Vernaschen
### 4.8.2 Konvertieren mit OutputStreamWriter-Klassen 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 zum Lesen von Byte-Folgen und Konvertieren in Unicode.
Beispiel Zum korrekten Darstellen der Umlaute auf der DOS-Konsole wird ein Output-StreamWriter mit der Codepage 850 (DOS-Latin-1) verwendet: Listing 4.13 GetBytesConverter.java, main()
    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); }
    }
Die Standard-Kodierung von Windows, Cp1252 (Windows-1252, beziehungsweise Windows Latin 1), ist eine Anpassung von ISO 8859-1, die in den Bereich 0x80 bis 0x9f andere Zeichen setzt.
Sollen ganze Dateien umkodiert werden, lässt sich auf der Kommandozeile das Dienstprogramm native2ascii nutzen. ### 4.8.3 Das Paket java.nio.charset 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 aller angemeldeten Kodierer. Die konkreten Kodierungsklassen erfragen auch Charset.forName().
    for ( String charsetName : Charset.availableCharsets().keySet() )
    {
      System.out.println( charsetName );

      Charset charset = Charset.forName( charsetName );
      System.out.println( charset );      // Ausgabe wie oben
    }
Mit dem konkreten Charset-Objekt lässt sich auf zwei Wegen weiter verfahren: Direkt mit den Methoden encode() und decode() konvertieren oder über die Methode newDecoder() einen CharsetDecoder beziehungsweise über newEncoder() einen CharsetEncoder erfragen und damit arbeiten. ### 4.8.4 Base64-Kodierung Für die Übertragung von Binärdaten hat sich im Internet die Base64-Kodierung durchgesetzt, die zum Beispiel bei E-Mail-Anhängen und SOAP-Nachrichten zu finden ist. Die im RFC 1521 beschriebene Methode übersetzt drei Bytes (24 Bit) in vier Base64-kodierte Zeichen (4 Zeichen mit jeweils 6 repräsentativen Bits). Die Base64-Zeichen bestehen aus den Buchstaben des lateinischen Alphabets, den Ziffern 0 bis 9 sowie »+«, »/« und »=«. Die Konsequenz dieser Umformung ist, dass Binärdaten rund 33 % größer werden. Sun liefert zwar in der Java-Bibliothek Unterstützung für diese Umsetzung, aber nicht ganz legal: Die Kodierer liegen im nicht-öffentlichen Paket sun.misc. Wem das nicht ganz geheuer ist, der kann unter http://jakarta.apache.org/commons/codec/ die Commons-Bibliothek beziehen. Das folgende Beispiel erzeugt zuerst ein Bytefeld der Größe 112 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. Listing 4.14 Base64Demo.java
    import java.io.IOException;
    import java.util.*;
    import sun.misc.*;

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

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

        // Zum Beispiel:
        // QFgwDyiQ28/4GsF75fqLMj/bAIWNwOuBmE/SCl3H2XQFpSsSz0jtyR0LU+kLiwWsnSUZljJr97Hy
        // LA3YUbf96Ym2zx9F9Y1N7P5lsOCb/vr2crTQ/gXs757qaJF9E3szMN+E0CSSslDrrzcNBrlcQg==
        // String in byte[]
        byte[] bytes2 = new BASE64Decoder().decodeBuffer( s );
        System.out.println( Arrays.equals(bytes1, bytes2) );    // true
      }
    }
### Ihr Kommentar Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.
Name |
E-Mail |
Ihr Kommentar |
<< zurück | <top> | vor >>

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