| Encoding | Verwendung | ä | ö | ü | ß | § | € | ½ | ² | √ | ∑ |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 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. | 84 | 94 | 81 | E1 | - | - | AB | FD | FB | - |
| Codepage 850 = CP850 = DOS-Latin-1 |
In westeuropäischen Ländern im Windows-Kommandozeilenfenster (= DOS-Box) verwendeter 8-Bit-Zeichensatz. | 84 | 94 | 81 | E1 | F5 | - | AB | FD | - | - |
| 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. |
E4 | F6 | FC | DF | A7 | 80 | BD | B2 | - | - |
| 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. |
E4 | F6 | FC | DF | A7 | - | BD | B2 | - | - |
| ISO 8859-15 = Latin-9 |
Ähnlich wie ISO 8859-1, aber enthält € und zusätzliche französiche Sonderzeichen. | E4 | F6 | FC | DF | A7 | A4 | - | 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. | C3A4 | C3B6 | C3BC | C39F | C2A7 | E282AC | C2BD | C2B2 | E2889A | E28891 |
| 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. | 00E4 | 00F6 | 00FC | 00DF | 00A7 | 20AC | 00BD | 00B2 | 221A | 2211 |
| EBCDIC 273 |
Hauptsächlich auf IBM-Großrechnern (AS/400, iSeries) verwendeter 8-Bit-Zeichensatz. | C0 | 6A | D0 | A1 | 7C | - | B8 | EA | - | - |
| 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> &#x20AC; = € <br/> &#x80; = € <br/> &euro; = € <br/> ' ä ö ü ß § ½ ² € √ ∑ <br/> </body></html>
Legen Sie folgende Euro-Encoding.xml an:
<!-- Euro-Encoding.xml --> <x><e-20AC> &#x20AC; = € </e-20AC> <e-0080> &#x80; = € </e-0080> <e-euro> &euro; = Nicht definierte Entität </e-euro> <Sonderzeichen> ' ä ö ü ß § ½ ² € √ ∑ </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
(€, € und €).
In der XML-Datei funktioniert nur €.
Bei € wird in den meisten Browsern nichts angezeigt und € würde sogar zu der Fehlermeldung "Nicht definierte Entität" führen.
In XML gibt es nur fünf Entitäten:
| & | & |
| < | < |
| > | > |
| " | " |
| ' | ' |
Einen weiteren Unterschied gibt es mit der (in den Beispielen in den Sonderzeichen enthaltenen) '-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.
| Software | Hinweise, 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, ... |
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:
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.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>" ) );
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: ä ö ü ß § € ½ ² √ ∑
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-Kommandofenster | Eclipse unter Windows | Linux |
|---|---|---|
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.