Text-Encoding, Codepage, Charset

+ andere TechDocs
+ Zeichenkodierung
+


Inhalt

  1. Beispiele für Text-Encodings (Codepages, Charsets)
  2. Hinweise, Beispiele und Einstellmöglichkeiten
  3. Setzen der Codepage für die Konsolenausgabe mit Java


Beispiele für Text-Encodings (Codepages, Charsets)

EncodingVerwendung äöüß§ ½²
ASCII
= ANSI X3.4-1986
8-Bit-Zeichensatz, der aber nur 7 Bits verwendet und somit nur 128 Zeichen enthält (33 Steuerzeichen und 95 druckbare Zeichen). ----------
Codepage 437
= CP437
= DOS-US
= OEM-US
In USA im Windows-Kommandozeilenfenster (= DOS-Box) verwendeter 8-Bit-Zeichensatz. 849481E1--ABFDFB-
Codepage 850
= CP850
= DOS-Latin-1
In westeuropäischen Ländern im Windows-Kommandozeilenfenster (= DOS-Box) verwendeter 8-Bit-Zeichensatz. 849481E1F5-ABFD--
Cp1252
= Windows-1252
Windows-Standardzeichensatz für westeuropäische Länder (8 Bit).
Cp1252 enthält alle Zeichen aus ISO 8859-1 und ISO 8859-15, allerdings teilweise mit anderer Kodierung.
E4F6FCDFA780BDB2--
ISO 8859-1
= Latin-1
Häufig in HTML-Seiten verwendeter 8-Bit-Zeichensatz, inkl. äöüß, aber ohne €.
Siehe auch den Vergleich 8859-1 / 8859-15 / 1252 / Unicode.
E4F6FCDFA7-BDB2--
ISO 8859-15
= Latin-9
Ähnlich wie ISO 8859-1, aber enthält € und zusätzliche französiche Sonderzeichen. E4F6FCDFA7A4-B2--
UTF-8
Die am weitesten verbreitete Kodierung für Unicode-Zeichen. Wird in einigen Betriebssystemen (GNU/Linux, Unix) und teilweise in verschiedenen Internetdiensten (E-Mail, Web) verwendet. Zeichen werden in verschiedener Länge von 1 bis 4 Bytes kodiert. C3A4C3B6C3BCC39FC2A7E282ACC2BDC2B2E2889AE28891
UTF-16
(manchmal auch
mit Unicode
gemeint)
Wird in einigen Betriebssystemen (Windows, OS X) und Programmiersprachen (Java, .NET) für die interne Zeichendarstellung verwendet. Zeichen werden entweder in 2 oder in 4 Bytes kodiert. Siehe auch Suchseiten isthisthingon-unicode und fileformat-unicode. 00E400F600FC00DF00A720AC00BD00B2221A2211
EBCDIC 273
Hauptsächlich auf IBM-Großrechnern (AS/400, iSeries) verwendeter 8-Bit-Zeichensatz. C06AD0A17C-B8EA--
HTML-Entitäten "Named entities" für nicht-ASCII-Zeichen in HTML-Sourcecode (aber nicht für XHTML und nicht für XML). äöüß§€ ½²√∑

Die Felder in den ä/ö/ü/ß/§/€/½/²/√/∑-Spalten enthalten den Zeichencode in Hexadezimaldarstellung.

HTML und XML unterstützen Unicode mit Zeichencodes, die unabhängig vom eingestellten Zeichensatz das Unicode-Zeichen darstellen. Die Notation lautet � für dezimale Notation bzw. � für hexadezimale Notation, wobei das 0000 die Unicode-Nummer des Zeichens darstellt.

Zwischen HTML und XML gibt es wichtige Unterschiede, wie das folgende Beispiel demonstriert:

Legen Sie folgende Euro-Encoding.html an:

<html><body>
<h3> Euro-Encoding.html </h3>
&amp;#x20AC; = &#x20AC; <br/>
&amp;#x80;   = &#x80; <br/>
&amp;euro;   = &euro; <br/>
&apos; &#xE4; &#xF6; &#xFC; &#xDF; &#xA7; &#xBD; &#xB2; &#x20AC; &#x221A; &#x2211; <br/>
</body></html>

Legen Sie folgende Euro-Encoding.xml an:

<!-- Euro-Encoding.xml -->
<x><e-20AC> &amp;#x20AC; = &#x20AC; </e-20AC>
   <e-0080> &amp;#x80;   = &#x80; </e-0080>
   <e-euro> &amp;euro;   = Nicht definierte Entit&#xE4;t </e-euro>
   <Sonderzeichen> &apos; &#xE4; &#xF6; &#xFC; &#xDF; &#xA7; &#xBD; &#xB2; &#x20AC; &#x221A; &#x2211; </Sonderzeichen>
</x>

Laden Sie beide Dateien in einen Webbrowser: In der HTML-Datei funktionieren unter Windows im Mozilla Firefox 3.5 und Microsoft Internet Explorer 8 alle drei Kodierungen des €-Zeichens (&#x20AC;, &#x80; und &euro;). In der XML-Datei funktioniert nur &#x20AC;. Bei &#x80; wird in den meisten Browsern nichts angezeigt und &euro; würde sogar zu der Fehlermeldung "Nicht definierte Entität" führen.
In XML gibt es nur fünf Entitäten:

&amp; &
&lt; <
&gt; >
&quot; "
&apos; '

Einen weiteren Unterschied gibt es mit der (in den Beispielen in den Sonderzeichen enthaltenen) &apos;-Entity-Referenz für das Apostroph ('): Während dies in XML-Dateien korrekt erkannt wird, zeigt es der Mozilla Firefox 3.5 auch in der HTML-Datei korrekt an, aber der Microsoft Internet Explorer 8 nicht.

Unter Windows kann in einigen Programmen (in RichEdit-Feldern) der Zeichencode dezimal als Alt+<dezimales Unicode> auf dem numerischen Tastaturfeld eingegeben werden. Ab Microsoft Word 2002 kann Unicode auch hexadezimal eingegeben werden, indem im Dokument <Unicode> oder U+<Unicode> eingetippt wird und anschließend die Tastenkombination Alt+C im Dokument bzw. Alt+X in Dialogfeldern gedrückt wird. Diese Tastenkombination kann auch benutzt werden, um den Code des vor dem Cursor stehenden Zeichens anzuzeigen.

Bei Dateien im UTF-Format wird oft ein BOM-Prefix vorangestellt, mit dem die Byte-Reihenfolge (Little-Endian oder Big-Endian) unterschieden werden kann. Dies kann allerdings in einigen Anwendungen zu Problemen führen. In einigen Editoren können Sie die BOM-Behandlung konfigurieren, siehe zum Beispiel UltraEdit.



Hinweise, Beispiele und Einstellmöglichkeiten

SoftwareHinweise, Beispiele und Einstellmöglichkeiten
Windows Cp1252 / Codepage 850:
Der Windows-Standardzeichensatz für westeuropäische Länder ist der 8-Bit-Zeichensatz Cp1252 (obwohl Windows intern UTF-16 verwendet). Im Kommandozeilenfenster (= DOS-Box) verwendet Windows normalerweise einen anderen Zeichensatz (in Westeuropa CP850).
chcp.com:
Das im Windows-Kommandozeilenfenster ausführbare Kommando CHCP zeigt die aktive Codepage des Kommandozeilenfensters an (normalerweise 850) und ermöglicht die Umschaltung auf eine andere Codepage.
charmap.exe:
Zeichentabelle-Anzeigeprogramm unter Windows.
CodePage-Einstellungen in der Windows-Registry:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
Java Infos zum Text-Encoding in Java:
Converting Text, Lexical Structure und Supported Encodings.
Beispiele für Java-Klassen, bei denen Text-Encoding eine Rolle spielt:
Charset, CharsetEncoder, String, String.getBytes(), InputStreamReader, InputStreamReader.getEncoding(), OutputStreamWriter, OutputStreamWriter.getEncoding(), Properties.load(), Properties.store(), ServletResponse.setContentType().
Java verwendet intern UTF-16. Aber die Properties-Klasse liest und speichert Properties-Dateien in ISO-8859-1 (Sonderzeichen müssen als Unicode-Escape-Sequenz "\uXXXX" eingetragen sein).
native2ascii.exe:
Der Native-to-ASCII Converter (im JDK-bin-Verzeichnis) kann das Character Encoding von Properties-Dateien konvertieren.
JVM Als JVM-Kommandozeilenparameter beispielsweise:
-Duser.language=de -Duser.region=DE -Dfile.encoding=ISO-8859-1
Maven Für Maven 2 gibt es leider noch keine Property für das Encoding von Sourcecode, aber immerhin einen Vorschlag für ein POM Element for Source File Encoding.
Eclipse Global:
'Window' | 'Preferences' | 'General' | 'Workspace': "Text file encoding":
Unter Windows meistens Cp1252, unter Linux meistens UTF-8.
Projektspezifisch:
Im Project Explorer mit rechter Maustaste auf Projekt, 'Properties' | 'Resource': "Text file encoding".
XML Erste Zeile von XML-Dateien, beispielsweise:
<?xml version="1.0" encoding="UTF-8"?>
MySQL Geben Sie das gewünschte Encoding vor, beispielsweise in der mysql.ini oder als Postfix zur DriverManager-Connection-URL und überprüfen Sie die eingestellten Werte:
default-character-set=utf8
?useUnicode=true&characterEncoding=UTF-8
Show Variables;
character_set_connection = utf8
Sehen Sie sich an: UTF-8 mit MySQL.
Oracle-DB Prüfen Sie die länderspezifischen DB-Einstellungen:
Select * from nls_database_parameters;
NLS_CHARACTERSET: AL32UTF8

Wenn Sie als Client SqlPlus verwenden, muss die NLS_LANG-Variable korrekt gesetzt sein.
Sehen Sie sich an: Probleme mit UTF-8 unter Oracle.
IBM DB2/400
(AS/400, iSeries)
Häufig EBCDIC mit Cp273. Siehe auch:
Select CCSID from SysColumns;
DB2CODEPAGE
HTML Einstellung im HTML-Header-Sourcecode, beispielsweise:
<head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" /></head>
JSP Einstellung im JSP-Sourcecode, beispielsweise:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %>
Oracle WebLogic In der weblogic.xml wird der Character Set für GET- und POST-Daten in HTTP-Requests voreingestellt, beispielsweise so:
...<charset-params><input-charset>
   <java-charset-name>UTF-8</java-charset-name>...
Apache HTTP Server Konfigurationsdatei httpd.conf:
AddDefaultCharset ISO-8859-1
etc. Es gibt natürlich noch viele weitere Möglichkeiten für Encoding-Fehlinterpretationen, beispielsweise SQL-Skripte, JMS-Messagetexte, in der URL enthaltene HTTP-GET- und REST-Parameter, ...


Setzen der Codepage für die Konsolenausgabe mit Java

Wenn Sie unter Windows im Kommandozeilenfenster (DOS-Box) in Java-Programmen den Text "äöüß§€½²√∑" einfach mit System.out.println() ausgeben, erhalten Sie "õ÷³¯ºÇ¢¦??" statt des gewünschten Textes.

Um die korrekte Ausgabe zu erhalten, müssen Sie die Codepage umschalten. Leider gibt es in Java keinen direkten Weg, um die Codepage des Kommandozeilenfensters zu erfragen. Deshalb muss die korrekte Codepage entweder geraten werden (im unten gezeigten ConsoleEncoding-Programm über System.getProperty( "os.name" )) oder die gewünschte Codepage wird übergeben (im ConsoleEncoding-Programm über System.getProperty( "console.encoding" )).

Zum Setzen der Codepage gibt es mehrere Möglichkeiten:

  1. Sie können die System-Property "file.encoding" auf die gewünschte Codepage setzen, zum Beispiel für das ConsoleEncoding-Programm so:

    java -Dfile.encoding=CP850 ConsoleEncoding

    Dann sind alle drei Ausgaben von ConsoleEncoding korrekt (außer den €/√/∑-Zeichen, die es in CP850 nicht gibt). Der Nachteil ist, dass jetzt auch Dateioperationen mit dieser Codepage erfolgen, was normalerweise nicht gewünscht ist.

  2. Besser ist normalerweise, wenn nur die Codepage der Textausgabe im Kommandozeilenfenster umgeschaltet wird. Hierzu gibt es auch mehrere Möglichkeiten. Bei der ersten Möglichkeit wird ein PrintWriter mit der gewünschten Codepage erzeugt, über den die Ausgabe erfolgt:

    PrintWriter pw = new PrintWriter( new OutputStreamWriter( System.out, "<MeineCodepage>" ) );

  3. Alternativ kann der Standard-Output-Stream umgelenkt werden über:

    System.setOut( new PrintStream( System.out, true, "<MeineCodepage>" ) );

    Dann wird bei allen folgenden Ausgaben mit System.out.println() die gesetzte Codepage verwendet.

Testen Sie die beiden letzten Optionen mit folgendem ConsoleEncoding-Programm (für die Sonderzeichen: "ä ö ü ß § € ½ ² √ ∑", oder übergeben Sie andere Sonderzeichen als Kommandozeilenparameter):

javac ConsoleEncoding.java

java ConsoleEncoding [im Windows-Kommandozeilenfenster]
java -Dconsole.encoding=CP850 ConsoleEncoding
java -Dconsole.encoding=Cp1252 ConsoleEncoding [in Eclipse-Konsole]
java ConsoleEncoding [unter Linux]

import java.io.*;
import java.nio.charset.Charset;

/**
 * Aufrufbeispiel fuer Linux:
 *    java ConsoleEncoding
 * Aufrufbeispiel fuer Windows in Westeuropa:
 *    java -Dconsole.encoding=CP850 ConsoleEncoding
 * Aufrufbeispiel innerhalb Eclipse unter Windows:
 *    java -Dconsole.encoding=Cp1252 ConsoleEncoding
 */
public class ConsoleEncoding
{
   public static void main( String[] args ) throws IOException
   {
      // Sonderzeichen: &auml; &ouml; &uuml; &szlig; &sect; &euro; &frac12; &sup2; &radic; &sum;
      String sonderzeichen = ( args.length > 0 ) ? args[0] :
                             "\u00E4\u00F6\u00FC\u00DF\u00A7\u20AC\u00BD\u00B2\u221A\u2211";
      String osn  = System.getProperty( "os.name" );
      String fcp  = System.getProperty( "file.encoding" );
      String ccp  = System.getProperty( "console.encoding" );
      String ccps = ccp + " (uebergeben)";

      if( ccp == null ) {
         // Wir raten die Codepage der Konsole
         // (Cp850 ist nur fuer westeuropaeische Laender korrekt):
         ccp = ( osn != null && osn.contains( "Windows" ) ) ? "Cp850" : fcp;
         ccps = ccp + " (vermutet)";
      }

      System.out.println( "os.name:          " + osn );
      System.out.println( "default-charset:  " + Charset.defaultCharset() );
      System.out.println( "file.encoding:    " + fcp );
      System.out.println( "console.encoding: " + ccps );

      // Ausgabe mit Standard-System.out und unveraenderter Codepage:
      System.out.println( "Mit System.out:   " + sonderzeichen );

      // Ausgabe mit PrintWriter und gesetzter Konsolen-Codepage:
      PrintWriter pw = new PrintWriter( new OutputStreamWriter( System.out, ccp ) );
      pw.println( "Mit PrintWriter:  " + sonderzeichen );
      pw.flush();

      // System.out-Ausgabe mit neuem PrintStream mit gesetzter Konsolen-Codepage:
      System.setOut( new PrintStream( System.out, true, ccp ) );
      System.setErr( new PrintStream( System.err, true, ccp ) );
      System.out.println( "Mit PrintStream:  " + sonderzeichen );
   }
}

Sie erhalten:

Windows-KommandofensterEclipse unter WindowsLinux
os.name:          Windows Vista
default-charset:  windows-1252
file.encoding:    Cp1252
console.encoding: Cp850
Mit System.out:   õ÷³¯ºÇ¢¦??
Mit PrintWriter:  äöüß§?½²??
Mit PrintStream:  äöüß§?½²??
os.name:          Windows Vista
default-charset:  windows-1252
file.encoding:    Cp1252
console.encoding: Cp1252
Mit System.out:   äöüß§€½²??
Mit PrintWriter:  äöüß§€½²??
Mit PrintStream:  äöüß§€½²??
os.name:          Linux
default-charset:  UTF-8
file.encoding:    UTF-8
console.encoding: UTF-8
Mit System.out:   äöüß§€½²√∑
Mit PrintWriter:  äöüß§€½²√∑
Mit PrintStream:  äöüß§€½²√∑ 

In Eclipse hat das Konsolenfenster nicht die Codepage CP850, sondern die Standard-Codepage (wie "file.encoding", also unter Windows Cp1252). Um unter Windows in Eclipse korrekte Ausgaben zu erzielen, geben Sie unter 'Run' | 'Run Configurations...' | 'Arguments' | 'VM arguments' ein: -Dconsole.encoding=Cp1252.





Weitere Themen: andere TechDocs | Zeichenkodierung | Glossar
© 2009 Torsten Horn, Aachen