Bytes aus Strings in C# ohne Kodierung: Das Problem richtig lösen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum ist diese Frage auf Stack Overflow so beliebt?



Wenn du jemals in C# geschrieben hast und einen String in ein Byte-Array konvertieren musstest, hast du dich wahrscheinlich gefragt: "Warum muss ich eine Codierung angeben? Ein String ist doch einfach ein String!" Diese Frage hat auf Stack Overflow aus gutem Grund tausende von Aufrufen erhalten. Sie berührt ein grundlegendes Missverständnis zwischen wie wir Text sehen und wie der Computer ihn sieht.



In diesem Artikel liefern wir nicht nur fertigen Code; wir erklären auch, warum Encoding.UTF8.GetBytes("hallo") kein Workaround, sondern der einzig korrekte Ansatz ist. Du wirst lernen, wie du die Byte-Repräsentation von Strings in C# erhältst, ohne Datenverlust zu riskieren, und was hinter der Magie der "automatischen Codierungsauswahl" steckt.



Der Mythos des "codierungsfreien Strings"



Viele Anfänger denken, dass ein String in C# nur eine Folge von Bytes ist. Das stimmt nicht. Intern wird string in .NET als UTF-16 (Zwei-Byte-Zeichen) gespeichert. Wenn du "Привет" schreibst, belegt es 12 Bytes im Speicher (6 Zeichen × 2 Bytes). Aber wenn du versuchst, diesen String an eine Datei, ein Netzwerk oder eine Datenbank zu senden, benötigst du fast immer ein anderes Format – am häufigsten UTF-8.



Zu versuchen, Bytes "ohne Codierung" zu erhalten, ist wie die Frage: "Wie übersetze ich ein Buch von Russisch ins Englisch, ohne die Sprache anzugeben?" Es ist unmöglich. Codierung ist die Reihe von Regeln zur Umwandlung von Zeichen in Bytes. Ohne sie erhältst du Kauderwelsch.



Wie man es NICHT macht (ein typischer Fehler)



string text = "Hallo, мир!";byte[] falscheBytes = System.Text.Encoding.Default.GetBytes(text); // SCHLECHT!


Dieser Code verwendet die systemweite Standardcodierung (normalerweise Windows-1251 auf einem russischen Windows). Wenn du diesen Code auf einem anderen Rechner oder unter Linux ausführst, erhältst du andere Bytes. Deine Anwendung wird unberechenbar.



Der korrekte Ansatz: Explizite Codierungsangabe



Der einzig zuverlässige Weg, eine konsistente Byte-Repräsentation von Strings zu erhalten, ist die explizite Angabe der Codierung. Die beliebteste und empfohlene Option ist UTF-8:



string text = "Hallo, мир!";byte[] utf8Bytes = System.Text.Encoding.UTF8.GetBytes(text);// Ergebnis: [72, 97, 108, 108, 111, 44, 32, 208, 188, 208, 184, 209, 128, 33]


Dieser Code wird auf jeder Plattform immer das gleiche Ergebnis liefern. Warum? Weil UTF-8 ein internationaler Standard ist, der überall gleich funktioniert.



Andere Codierungsoptionen (Wann sie benötigt werden)



  • ASCII — Nur lateinische Zeichen, verwirft alle Zeichen >127.
  • Unicode (UTF-16LE) — C#s internes Format, aber ineffizient für die Speicherung.
  • Windows-1251 — Veraltet, nur für Kompatibilität mit älteren Systemen.


Verwende für 99 % der modernen Aufgaben Encoding.UTF8.



Was, wenn ich es "ohne Angabe" möchte? Gibt es einen Hack?



Technisch gesehen kannst du BitConverter.ToString() oder unsicheren Code mit Zeigern verwenden, aber das liefert dir die rohen UTF-16-Bytes, die im Speicher abgelegt sind. Das ist aus mehreren Gründen eine schlechte Idee:



  • Das Ergebnis hängt von der Plattform ab (Little-Endian vs Big-Endian).
  • Du erhältst zusätzliche Null-Bytes für lateinische Zeichen (jedes Zeichen belegt 2 Bytes).
  • Mit einer Änderung der .NET-Version könnte sich die interne Darstellung ändern (unwahrscheinlich, aber möglich).


Beispiel für gefährlichen Code, den du nicht nachahmen solltest:



unsafe{    string text = "Hallo";    fixed (char* ptr = text)    {        byte* bytePtr = (byte*)ptr;        // Arbeiten mit rohen UTF-16-Bytes    }}


Das funktioniert, verletzt aber das Prinzip "Fass niemals Interna an, wenn du die Konsequenzen nicht verstehst."



Best Practices für Anfänger

Blogs

Buchempfehlungen