Advanced Services | Encoding |
Früher war alles einfacher. Wenn man Text speicherte wurde er im ASCII-Code gespeichert. Für Großrechner (praktisch nur IBM)
gab es dann noch den EBCDI-Code. Heute ist die Sache nicht mehr so einfach, wie die folgende Tabelle der Encodings zeigt.
Zwar haben alle Codes den ASCII-Code als Untermenge, aber danach unterscheiden sich die Codierungen mehr oder weniger.
Ein Buchstabe oder Zeichen wird also heute mit Hilfe einer Übersetzungstabelle (Unicodetabelle) auf eine Folge von Bytes abgebildet.
Mittlerweile gibt es weit über 100 verschiedene Zeichentabellen. Auf Windowsrechnern wird in Westeuropa der Code Windows-1252
verwendet. StreamReader und StreamWriter allerdings verwenden standardmäßig UTF-8, also ein anderes Encoding als
der Windowsrechner. Die meisten ASCII-Editoren und auch Word speichern auf Windowsrechnern ihre Texte aber in Windows-1252
(Westeuropa vorausgesetzt). Warum dieser Unterschied? Mit UTF-8 macht sich VisualStudio unabhängig von der Ländereinstellung
des Rechners. UTF-8 ist mittlerweile auch das am weitesten verbreitete Encoding geworden und das aus gutem Grund, wie man
auf Wikipedia lesen kann:
UTF-8 (UCS Transformation Format — 8-bit[1]) is a variable-width encoding that can represent every character in the Unicode
character set. It was designed for backward compatibility with ASCII and to avoid the complications of endianness and byte
order marks (compare UTF-16 and UTF-32). For these and other reasons, UTF-8 has become the dominant character encoding for the World-Wide Web...
(http://en.wikipedia.org/wiki/UTF-8)
Für die abstrakte Klasse Encoding braucht man das using System.Text, aber keine neue Referenz. Die Klasse enthält statische und nichtstatische Methoden sowie abstrakte und nichtabstrakte Properties. Die abstrakten Properties können natürlich nur in einer Unterklasse realisiert werden. Darauf wird hier nicht eingegangen. Mit dieser Klasse kann man Encodingobjekte anlegen und zwischen verschiedenen Encodings konvertieren.
Einige Methoden | |
---|---|
Returntyp | Name der Methode |
static byte[] | Convert() Overloaded. Converts a byte array from one encoding to another. |
override bool | Equals(Object value) Determines whether the specified Object is equal to the current instance. (Overrides Object.Equals(Object).) |
static Encoding | GetEncoding(int pageNumber ) Overloaded. Returns an encoding for the specified code page. |
static Encoding | GetEncoding(String) Overloaded. Returns an encoding for the specified code page. |
static EncodingInfo[] | GetEncodings() Returns an array containing all encodings. |
Einige Properties | |
---|---|
Typ | Name der Property |
static Encoding | ASCII Gets an encoding for the ASCII (7-bit) character set. |
static Encoding | Default Gets an encoding for the operating system's current ANSI code page. |
static Encoding | UTF32 Gets an encoding for the UTF-32 format using the little endian byte order. |
static Encoding | UTF7 Gets an encoding for the UTF-7 format. |
static Encoding | UTF8 Gets an encoding for the UTF-8 format. |
Die konstruktorlose Klasse EncodingInfo ist versiegelt und wird im Zusammenhang mit der Methode GetEncodings() aus Encoding benötigt. Diese Methode liefert ein Array vom Typ EncodingInfo[] zurück.
Einige Methoden | |
---|---|
Returntyp | Name der Methode |
Encoding | GetEncoding() Returns a Encoding object that corresponds to the current EncodingInfo object. |
Einige Properties | |
---|---|
Typ | Name der Property |
int | CodePage Gets the code page identifier of the encoding. |
String | DisplayName Gets the human-readable description of the encoding. |
String | Name Gets the name registered with the Internet Assigned Numbers Authority (IANA) for the encoding. |
In einfachster Form sieht das folgendermaßen aus.
using System; using System.IO; using System.Text; namespace EncodingDemo { class Encodings { static void Main(string[] args) { EncodingInfo[] encInfo = System.Text.Encoding.GetEncodings(); for (int i = 0; i < encInfo.Length; i++) { Console.WriteLine("{0,-8}{1,-25}{2}", encInfo[i].CodePage, encInfo[i].Name, encInfo[i].DisplayName); } Console.WriteLine(); } } }
Wir verwandeln das Array in eine List und sortieren diese mit dem Delegate Comparison [ public delegate int Comparison<in T>(T x, T y) ] . Dazu schreiben wir eine statische Methode CompareEncodingsByCodePage, die die Signatur des Delegate erfüllt.
private static int CompareEncodingsByCodePage(EncodingInfo i1, EncodingInfo i2) { return i1.CodePage - i2.CodePage; }
Diese Methode ist jedoch so einfach, daß sich hier ein Lambdaausdruck anbietet:
(i1, i2) => i1.CodePage - i2.CodePage
Damit ergibt sich folgendes Codeschnipsel.
using System; using System.IO; using System.Linq; using System.Text; private static void Encodings() { EncodingInfo[] encinfos = Encoding.GetEncodings(); List<EncodingInfo> listOfEncodings = encinfos.ToList(); //listOfEncodings.Sort(); //System.InvalidOperationException: Failed to compare two elements in the array.->System.ArgumentException: At least one object must implement IComparable. // verwende das delegate Comparison //listOfEncodings.Sort(CompareEncodingsByCodePage); //listOfEncodings.ForEach(info => Console.WriteLine("{0,-8}{1,-25}{2}", info.CodePage, info.Name, info.DisplayName)); //oder mit Lambda listOfEncodings.Sort( (i1, i2) => i1.CodePage - i2.CodePage ); listOfEncodings.ForEach(info => Console.WriteLine("{0,-8}{1,-25}{2}", info.CodePage, info.Name, info.DisplayName)); }
Obiges Progrämmchen ist die Basis für die auf der nächsten Seite folgende Tabelle der in C# verfügbaren Encodings .