Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.
 
Inhaltsverzeichnis
Vorwort
1 Neues in Java 8 und Java 7
2 Fortgeschrittene String-Verarbeitung
3 Threads und nebenläufige Programmierung
4 Datenstrukturen und Algorithmen
5 Raum und Zeit
6 Dateien, Verzeichnisse und Dateizugriffe
7 Datenströme
8 Die eXtensible Markup Language (XML)
9 Dateiformate
10 Grafische Oberflächen mit Swing
11 Grafikprogrammierung
12 JavaFX
13 Netzwerkprogrammierung
14 Verteilte Programmierung mit RMI
15 RESTful und SOAP-Web-Services
16 Technologien für die Infrastruktur
17 Typen, Reflection und Annotationen
18 Dynamische Übersetzung und Skriptsprachen
19 Logging und Monitoring
20 Sicherheitskonzepte
21 Datenbankmanagement mit JDBC
22 Java Native Interface (JNI)
23 Dienstprogramme für die Java-Umgebung
Stichwortverzeichnis

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java SE 8 Standard-Bibliothek von Christian Ullenboom
Das Handbuch für Java-Entwickler
Buch: Java SE 8 Standard-Bibliothek

Java SE 8 Standard-Bibliothek
Pfeil 2 Fortgeschrittene String-Verarbeitung
Pfeil 2.1 Erweitere Zeicheneigenschaften
Pfeil 2.1.1 isXXX(….)-Methoden
Pfeil 2.1.2 Unicode-Blöcke
Pfeil 2.1.3 Unicode-Skripte
Pfeil 2.2 Reguläre Ausdrücke
Pfeil 2.2.1 Pattern.matches(…) bzw. String#matches(…)
Pfeil 2.2.2 Die Klassen Pattern und Matcher
Pfeil 2.2.3 Finden und nicht matchen
Pfeil 2.2.4 Gruppen
Pfeil 2.2.5 Gierige und nicht gierige Operatoren *
Pfeil 2.2.6 Mit MatchResult alle Ergebnisse einsammeln *
Pfeil 2.2.7 Suchen und Ersetzen mit Mustern
Pfeil 2.2.8 Hangman Version 2
Pfeil 2.3 Zerlegen von Zeichenketten
Pfeil 2.3.1 Zerlegen von Zeichensequenzen über String oder Pattern
Pfeil 2.3.2 Mehr vom Scanner
Pfeil 2.3.3 Die Klasse StringTokenizer *
Pfeil 2.3.4 BreakIterator als Zeichen-, Wort-, Zeilen- und Satztrenner *
Pfeil 2.3.5 StreamTokenizer *
Pfeil 2.4 Zeichenkodierungen, XML/HTML-Entities, Base64 *
Pfeil 2.4.1 Unicode und 8-Bit-Abbildungen
Pfeil 2.4.2 Kodierungen über die Klasse String vornehmen
Pfeil 2.4.3 Das Paket java.nio.charset und der Typ Charset
Pfeil 2.4.4 Konvertieren mit OutputStreamWriter-/InputStreamReader-Klassen
Pfeil 2.4.5 XML/HTML-Entities ausmaskieren
Pfeil 2.4.6 Base64-Kodierung
Pfeil 2.5 Ausgaben formatieren
Pfeil 2.5.1 Die Formatter-Klasse *
Pfeil 2.5.2 Formatieren mit Masken *
Pfeil 2.5.3 Format-Klassen
Pfeil 2.5.4 Zahlen, Prozente und Währungen mit NumberFormat und DecimalFormat formatieren *
Pfeil 2.5.5 MessageFormat und Pluralbildung mit ChoiceFormat
Pfeil 2.6 Sprachabhängiges Vergleichen und Normalisierung *
Pfeil 2.6.1 Die Klasse Collator
Pfeil 2.6.2 Effiziente interne Speicherung für die Sortierung
Pfeil 2.6.3 Normalisierung
Pfeil 2.7 Phonetische Vergleiche *
Pfeil 2.8 Zum Weiterlesen
 
Zum Seitenanfang

2.4Zeichenkodierungen, XML/HTML-Entities, Base64 * Zur vorigen ÜberschriftZur nächsten Überschrift

 
Zum Seitenanfang

2.4.1Unicode und 8-Bit-Abbildungen Zur vorigen ÜberschriftZur nächsten Überschrift

Einzelne Zeichen sind in Java intern immer in 16-Bit-Unicode kodiert, und ein String ist eine Folge von Unicode-Zeichen. Wollen wir diese Unicode-Zeichenkette in eine Datei schreiben, können mitunter andere Programme die Dateien nicht wieder einlesen, da sie keine Unicode-Zeichen erwarten oder nicht damit umgehen können. Die Unicode-Strings müssen daher in unterschiedliche Codepages, etwa Latin-1, umkodiert werden.

 
Zum Seitenanfang

2.4.2Kodierungen über die Klasse String vornehmen Zur vorigen ÜberschriftZur nächsten Überschrift

Die String-Klasse konvertiert mit der Methode getBytes(String charsetName) bzw. getBytes(Charset charset) den String in ein Byte-Feld mit einer bestimmten Zeichenkodierung. Auf diese Weise kann Java die interne Unicode-Repräsentation zum Beispiel in den EBCDIC-Zeichensatz eines IBM-Mainframes übertragen. Jede Kodierung (engl. encoding) ist durch eine Zeichenfolge oder ein Charset-Objekt definiert; die Namen sind unter http://tutego.de/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.

[zB]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 Byte-Feld in einen Unicode-String, müssen Sie einen Konstruktor der String-Klasse mit der Kodierung nutzen. Auch hier kann eine UnsupportedEncodingException folgen, wenn es die Kodierung nicht gibt.

[zB]Beispiel

Kodiere das Byte-Feld 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
 
Zum Seitenanfang

2.4.3Das Paket java.nio.charset und der Typ Charset Zur vorigen ÜberschriftZur nächsten Überschrift

Konvertierungen zwischen Unicode-Strings und Byte-Folgen übernehmen java.nio.charset.Charset-Implementierungen. Die statische Methode Charset.availableCharsets() liefert eine Map<String, Charset> mit etwa 150 Einträgen – und somit Namen und assoziierte Klassen aller angemeldeten Kodierer. Ein Charset-Objekt lässt sich über einen Namen und dann mit Charset.forName(String charsetName) erfragen.

[zB]Beispiel

Gib alle Kodierungen aus:

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

  • über die Methode newDecoder(…) einen CharsetDecoder bzw. über newEncoder(…) einen CharsetEncoder erfragen und damit arbeiten

Oftmals wird ein Charset aber an Klassen übergeben, die ein Charset für ihre Arbeit nutzen. Eine kleine Auswahl:

  • byte[] String.getBytes(Charset charset)

  • InputStreamReader(InputStream in, Charset cs)

  • OutputStreamWriter(OutputStream out, Charset cs)

  • String(byte[] bytes, Charset charset)

  • String(byte[] bytes, int offset, int length, Charset charset)

StandardCharsets

Die am System voreingestellte Kodierung liefert die statische Methode Charset.defaultCharset(). Weiterhin gibt es eine Klasse StandardCharsets mit Konstanten für oft gebrauchte Charset-Objekte:

final class java.nio.charset.StandardCharsets
implements Cloneable
  • final static Charset ISO_8859_1

  • final static Charset US_ASCII

  • final static Charset UTF_16

  • final static Charset UTF_16BE

  • final static Charset UTF_16LE

  • final static Charset UTF_8

 
Zum Seitenanfang

2.4.4Konvertieren mit OutputStreamWriter-/InputStreamReader-Klassen Zur vorigen ÜberschriftZur nächsten Überschrift

Neben der Klasse String mit getBytes(…) unterstützen auch andere Klassen die Umkodierung. Dazu zählen:

  • OutputStreamWriter: Ein spezieller Writer, der Unicode-Zeichen mit einer gewählten Kodierung in einen binären Datenstrom schreibt.

  • InputStreamReader: Übernimmt den anderen Weg zum Lesen von Byte-Folgen und Konvertieren in Unicode. Ist ein Reader.

Genauer stellt Kapitel 7, »Datenströme«, die Klassen vor, daher folgt an dieser Stelle nur kurz ein Beispiel.

Konvertieren in DOS-Latin-1

Zum korrekten Darstellen der Umlaute auf der Windows-DOS-Konsole wird ein OutputStreamWriter mit der Codepage 850 (DOS-Latin-1) verwendet:

Listing 2.14GetBytesConverter.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 ) { e.printStackTrace(); }

Die Standardkodierung von Windows, »Cp1252« (Windows-1252 bzw. Windows Latin-1), ist eine Anpassung von ISO 8859-1, die andere Zeichen in den Bereich 0x80 bis 0x9f setzt.

[+]Tipp

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

 
Zum Seitenanfang

2.4.5XML/HTML-Entities ausmaskieren Zur vorigen ÜberschriftZur nächsten Überschrift

In einer XML-Datei dürfen bestimmte Zeichen im normalen Textstrom nicht vorkommen und müssen umkodiert werden:

Zeichen

Umkodierung

"

&quot;

&

&amp;

'

&apos;

<

&lt;

>

&gt;

Tabelle 2.10Umkodierungen für eine XML-Datei

Eine Konstruktion wie &quot; nennt sich Entity. Die gültigen Entities werden im XML-Standard beschrieben.

Weiterhin gilt, dass bei einer Webseitenkodierung in ISO-8859-1 nur die »sicheren« Zeichen wie Ziffern und Buchstaben verwendet werden können, aber keine Sonderzeichen, wie etwa das Copyright- oder das Euro-Zeichen. Daher bietet HTML eine Umkodierung für Sonderzeichen an, die nicht im Zeichenvorrat von ISO 8859-1 enthalten sind – für das Copyright-Zeichen ist es etwa &copy; und das Euro-Zeichen &euro;. In XML ist diese Umkodierung nicht nötig, da XML leicht als UTF-8 geschrieben werden kann, und dann heißt es für das Euro-Zeichen nach der Position in der Unicode-Tabelle einfach &#8364;.[ 26 ](Das führt in HTML zu viel mehr Entities als bei XML, sodass es ein Problem werden kann, eine HTML-Datei als XML einzulesen – der XML-Parser meckert dann über die unbekannten Entities.)

Java-Programme, die XML- oder HTML-Ausgaben erstellen oder XML-/HTML-Dokumente lesen, müssen auf die korrekte Konvertierung achten. Die Standardbibliothek bringt hier nichts Offensichtliches mit, aber Open-Source-Bibliotheken füllen diese Lücke – so etwa Apache Commons Lang (http://commons.apache.org/lang/), das mit der Klasse org.apache.commons.lang.StringEscapeUtils einige Kodierungsmethoden bietet, um einen String in XML/HTML umzukodieren und einen XML-/HTML-String mit Entities in einen Java-String zu bringen, bei dem insbesondere die HTML-Entities aufgelöst wurden. Die Klasse StringEscapeUtils bringt neben den statischen Methoden

  • String escapeHtml3(String input)

  • String unescapeHtml3(String input)

  • String escapeHtml4(String input)

  • String unescapeHtml4(String input)

  • String escapeXml(String input)

  • String unescapeXml(String input)

auch Methoden zum Maskieren von CSV-, Java- und JavaScript-Strings.

[zB]Beispiel

Für eine einfache Kodierung (ohne Hochkommata) lässt sich ein XMLStreamWriter einsetzen:

try {
StringWriter result = new StringWriter();
XMLStreamWriter converter =
XMLOutputFactory.newInstance().createXMLStreamWriter(result);
converter.writeCharacters( "<&'Müsli\">" );
System.out.println( result ); // &lt;&amp;'Müsli"&gt;
}
catch ( XMLStreamException | FactoryConfigurationError e ) {
e.printStackTrace();
}
 
Zum Seitenanfang

2.4.6Base64-Kodierung Zur vorigen ÜberschriftZur nächsten Überschrift

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. Auch bei der HTTP-Authentifizierung Basic Authentication kommt Base64 zum Tragen, denn die Konkatenation von Benutzername + »:« + Passwort wird über Base64 kodiert und so zum Server gesendet – der Sicherheitsgewinn ist natürlich null.

Die Base64-Kodierung wird im RFC 4648[ 27 ](http://tools.ietf.org/html/rfc4648) beschrieben. Drei Bytes (24 Bit) werden in vier Base64-kodierte Zeichen (vier Zeichen mit jeweils sechs repräsentativen Bits) umgesetzt. Die Konsequenz dieser Umformung ist, dass Binärdaten rund 33 % größer werden. Die Base64-Zeichen bestehen aus den Buchstaben des lateinischen Alphabets, den Ziffern 0 bis 9 sowie (im Normalfall) »+«, »/« und »=«.

Das JDK liefert seit Java 8 für diese Base64-Kodierung die Klasse java.util.BASE64 aus. Zwei innere Klassen Base64.Decoder bzw. Base64.Encoder kümmern sich um die Umwandlung. Zur Erzeugung der Exemplare gibt es statische Methoden in BASE64, und zwar nicht nur zwei, sondern sieben. Der Grund ist, dass es neben der Standardkonvertierung »Base« noch MIME und URL-/Dateiname-sicher gibt:

  • getEncoder() und getDecoder() liefern Exemplare vom Typ Base64.Encoder und Base64.Decoder bzw. für den normalen Basic-Typ.

  • getEncoder(int lineLength, byte[] lineSeparator), getMimeEncoder() und getMimeDecoder() liefern Encoder/Decoder für MIME-Nachrichten, bei denen Zeilen mit einem »\r« getrennt sind.

  • getUrlEncoder() und getUrlDecoder() nutzen zur Kodierung nur Zeichen, die für URL und Dateinamen gültig sind, und ersetzen »+« durch »-« und »/« durch »_«.

Beispiel

Das folgende Beispiel erzeugt zuerst ein Byte-Feld mit Zufallszahlen. Die Base64-Klasse kodiert das Byte-Feld in einen String, der auf dem Bildschirm ausgegeben wird. Nachdem der String wieder zurückkodiert wurde, werden die Byte-Felder verglichen und liefern natürlich true:

Listing 2.15Base64Demo.java, main()

byte[] bytes1 = SecureRandom.getSeed( 20 );

// byte[] -> String
String s = Base64.getEncoder().encodeToString( bytes1 );
System.out.println( s ); // z. B. TVST9v+JMk/vVUOSENmIcriXFLo=

// String -> byte[]
byte[] bytes2 = Base64.getDecoder().decode( s );
System.out.println( Arrays.equals(bytes1, bytes2) ); // true

Wer nicht mit Java 8 arbeiten kann, aber mit älteren Versionen vom Oracle-JDK, der kann BASE64Encoder/BASE64Decoder aus dem nichtöffentlichen Paket sun.misc nutzen.[ 28 ](Siehe dazu http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html. Bisher existieren sie aber seit über 10 Jahren, und wer Oracles Philosophie kennt, der weiß, dass die Abwärtskompatibilität oberste Priorität hat.) Wem das nicht ganz geheuer ist, der kann javax.mail.internet.MimeUtility von der JavaMail-API nutzen[ 29 ](http://www.rgagnon.com/javadetails/java-0598.html gibt ein Beispiel. Die JavaMail-API ist Teil von Java EE 5 und muss sonst für das Java SE als Bibliothek hinzugenommen werden.) oder unter http://commons.apache.org/proper/commons-codec/ die Bibliothek Commons Codec beziehen.

 


Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Java SE 8 Standard-Bibliothek Java SE 8 Standard-Bibliothek
Jetzt Buch bestellen

 Buchempfehlungen
Zum Rheinwerk-Shop: Java ist auch eine Insel
Java ist auch eine Insel


Zum Rheinwerk-Shop: Professionell entwickeln mit Java EE 8
Professionell entwickeln mit Java EE 8


Zum Rheinwerk-Shop: Besser coden
Besser coden


Zum Rheinwerk-Shop: Entwurfsmuster
Entwurfsmuster


Zum Rheinwerk-Shop: IT-Projektmanagement
IT-Projektmanagement


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2018
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.

 
Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern