1. Standard-Kodierung
Wenn du mit StreamReader oder StreamWriter arbeitest, verwenden sie eine Standard-Kodierung.
Wenn du zum Beispiel schreibst:
using var reader = new StreamReader("myfile.txt");
oder
using var writer = new StreamWriter("output.txt");
.NET wählt die Standard-Kodierung. Unter Windows ist das normalerweise UTF-8 (häufig ohne BOM), aber in alten Anwendungen oder beim Start auf anderen Systemen kann das Verhalten abweichen.
In den meisten Fällen ist UTF-8 eine gute Wahl: es unterstützt alle Sprachen und speichert Text auf Englisch (und auch auf Russisch) kompakt. Wenn die Datei aber in einer anderen Kodierung erstellt wurde (z.B. Windows-1251) oder von anderen Programmen gelesen wird, die eine bestimmte Kodierung erwarten, solltest du die gewünschte Kodierung explizit angeben.
2. Kodierung für StreamReader und StreamWriter angeben
Varianten der Konstruktoren
Sowohl StreamReader als auch StreamWriter unterstützen Konstruktoren, in die du ein Objekt vom Typ System.Text.Encoding übergeben kannst.
Beispiel:
using var reader = new StreamReader("myfile.txt", Encoding.UTF8);
using var writer = new StreamWriter("output.txt", false, Encoding.UTF8);
Wenn du mit ASCII, Windows-1251 oder UTF-16 arbeiten willst, setzt du einfach eine andere Kodierung ein:
using var reader = new StreamReader("myfile.txt", Encoding.Unicode); // UTF-16
using var reader2 = new StreamReader("rus.txt", Encoding.GetEncoding("windows-1251"));
Kurz-Tabelle gängiger Kodierungen:
| Kodierung | C#-Ausdruck | Beschreibung |
|---|---|---|
| UTF-8 | |
Unterstützt alle Sprachen, kompakt |
| UTF-16 (Unicode) | |
Standard in .NET, 2 Bytes pro Zeichen |
| ASCII | |
Nur Basiszeichen (englisch) |
| Windows-1251 | |
Russisch, alte Windows-Programme |
Achtung! Für nicht-standard Kodierungen wie Windows-1251 benutze die Methode Encoding.GetEncoding("windows-1251").
3. Lesen und Schreiben mit angegebener Kodierung
Fügen wir unserem kleinen Übungsprogramm eine neue Funktion hinzu: es soll eine Datei in einer angegebenen Kodierung lesen und das Ergebnis in einer neuen Datei schreiben, ebenfalls mit explizit gesetzter Kodierung. So kannst du z.B. Text zwischen verschiedenen Systemen konvertieren!
Beispiel 1: Datei in Windows-1251 lesen und auf der Konsole ausgeben
// Angenommen, die Datei wurde in altem Windows-1251 erstellt
using var reader = new StreamReader("ru_text.txt", Encoding.GetEncoding("windows-1251"));
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
Warum das wichtig ist: Wenn wir die Kodierung nicht angeben würden, bekämen wir statt kyrillischer Buchstaben hässliche Zeichenfolgen wie "Учебник".
Beispiel 2: Datei in UTF-16 (Unicode) schreiben
using var writer = new StreamWriter("utf16text.txt", false, Encoding.Unicode);
writer.WriteLine("Hallo, Welt!");
writer.WriteLine("Hello, world!");
writer.WriteLine("こんにちは世界");
Ergebnis: Öffnest du die Datei z.B. in Notepad, siehst du, dass alle Zeichen korrekt dargestellt werden.
4. Kleines Hilfsprogramm zur Konvertierung von Kodierungen
Aufgabe (die oft in Interviews kommt!): Eine Textdatei von Windows-1251 nach UTF-8 konvertieren.
string sourcePath = "ru_text_1251.txt";
string destPath = "ru_text_utf8.txt";
// Lesen in Windows-1251
using var reader = new StreamReader(sourcePath, Encoding.GetEncoding("windows-1251"));
// Schreiben in UTF-8
using var writer = new StreamWriter(destPath, false, Encoding.UTF8);
string? line;
while ((line = reader.ReadLine()) != null)
writer.WriteLine(line);
Jetzt kannst du ru_text_utf8.txt problemlos in VSCode, unter Linux oder auf dem Mac öffnen und lesbaren Text sehen.
5. Nützliche Hinweise
Wie findet man heraus, in welcher Kodierung eine Datei ist?
Das ist eine tückische Frage! Die Datei selbst speichert normalerweise nicht ihre Kodierung (Ausnahme sind Dateien mit BOM, dazu mehr in der nächsten Vorlesung). Wenn du eine Datei in der falschen Kodierung öffnest, bekommst du Kauderwelsch.
Praktische Ansätze:
- Wenn die Datei von deinem Programm erzeugt wurde – verwende immer dieselbe Kodierung beim Lesen, die du auch beim Schreiben verwendet hast.
- Wenn die Datei aus einer unbekannten Quelle kommt – probiere verschiedene Kodierungen oder nutze externe Tools zur Erkennung.
Arbeiten mit Emojis und ungewöhnlichen Zeichen
UTF-8 und UTF-16 erlauben problemlos Emojis und Zeichen aus verschiedenen Schriftsystemen. Versuch mal, eine Datei mit Emojis in UTF-8 zu speichern und sie dann in einer alten Kodierung zu öffnen – das kann lustig (oder störend) sein!
Code mit Emoji:
using var writer = new StreamWriter("emoji.txt", false, Encoding.UTF8);
writer.WriteLine("Hallo 👋😀🌍");
StreamReader mit automatischer Kodierungserkennung
Der Konstruktor von StreamReader hat eine Überladung mit dem Parameter detectEncodingFromByteOrderMarks:
new StreamReader(path, encoding, detectEncodingFromByteOrderMarks: true)
Wenn dieser Parameter true ist (das ist der Standard!), versucht StreamReader, die Kodierung anhand eines vorhandenen BOM (einer speziellen "Markierung" am Datei-Anfang) zu erraten. Wenn die Datei jedoch ohne BOM erstellt wurde oder eine exotische Kodierung hat, funktioniert das Erraten nicht.
Wann und warum solltest du die Kodierung explizit angeben?
- Mehrsprachige Daten: Unterstützung für Arabisch, Chinesisch, Emojis usw.
- Integrationen: Die Datei wird nicht nur von deinem Programm, sondern von Fremdsystemen gelesen, die eine bestimmte Kodierung erwarten.
- Dateigröße wichtig: ASCII/UTF-8 sparen Platz für lateinischen Text, UTF-16 kann für Ideogramme effizienter sein.
- Kompatibilität: Logs/Exports für andere Anwendungen.
6. Typische Fehler beim Arbeiten mit Kodierungen
Fehler Nr.1: kein explizites Angeben der Kodierung beim Lesen einer Datei.
Das Lesen einer Datei mit russischem (oder anderem nicht-lateinischen) Text ohne angegebene Kodierung führt oft zu unlesbarem "Kauderwelsch".
Fehler Nr.2: unterschiedliche Kodierungen beim Schreiben und Lesen.
Die Datei wurde in einer Kodierung geschrieben, aber in einer anderen geöffnet — das Ergebnis ist verzerrter Text. Das passiert häufig beim Wechsel zwischen unterschiedlichen OS oder Programmen.
Fehler Nr.3: nicht unterstützte oder nur teilweise unterstützte Kodierungen.
Manche Editoren gehen schlecht mit UTF-8 ohne BOM oder mit alten single-byte Kodierungen wie Windows-1251 um. Manchmal muss man manuell die Kodierung umschalten und ein bisschen probieren.
GO TO FULL VERSION