Advanced  Services Encoding Back Next Up Home


Grundlegendes

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)


Die Klasse Encoding

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.


EncodingInfo

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.


Codebeispiel 1: Alle Encodings auf die Konsole ausgeben

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();
      }
   }
}


Codebeispiel 2: Encodings sortieren nach CodePage und auf die Konsole ausgeben

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 .

Valid XHTML 1.0 Strict top Back Next Up Home