8 Stimmen

Was ist in C# String/Character Encoding der Unterschied zwischen GetBytes(), GetString() und Convert()?

Wir haben Probleme, eine Unicode-Zeichenfolge in eine UTF-8-Zeichenfolge zu konvertieren, um sie über die Leitung zu senden:

// Start with our unicode string.
string unicode = "Convert: \u10A0";

// Get an array of bytes representing the unicode string, two for each character.
byte[] source = Encoding.Unicode.GetBytes(unicode);

// Convert the Unicode bytes to UTF-8 representation.
byte[] converted = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, source);

// Now that we have converted the bytes, save them to a new string.
string utf8 = Encoding.UTF8.GetString(converted);

// Send the converted string using a Microsoft function.
MicrosoftFunc(utf8);

Obwohl wir die Zeichenfolge in UTF-8 konvertiert haben, kommt sie nicht als UTF-8 an.

12voto

Ryall Punkte 11649

Nach einem sehr unruhigen und verwirrenden Vormittag haben wir die Antwort auf dieses Problem gefunden.

Der wichtigste Punkt, den wir übersehen hatten und der die Sache sehr verwirrend machte, war, dass String-Typen immer in 16-Bit (2-Byte) Unicode kodiert sind . Das bedeutet, dass die Bytes bei der Ausführung von GetString() automatisch in Unicode umcodiert werden hinter den Kulissen und wir sind nicht besser dran, als wir es vorher waren.

Als wir anfingen, Zeichenfehler und Doppelbyte-Daten am anderen Ende zu erhalten, wussten wir, dass etwas nicht stimmte, aber bei einem Blick auf den Code, den wir hatten, konnten wir keinen Fehler erkennen. Nachdem wir gelernt hatten, was wir oben erklärt haben, wurde uns klar, dass wir das Byte-Array senden mussten, wenn wir die Kodierung beibehalten wollten. Glücklicherweise verfügte MicrosoftFunc() über eine Überladung, die ein Byte-Array anstelle eines Strings verarbeiten konnte. Das bedeutete, dass wir die Unicode-Zeichenkette in eine Kodierung unserer Wahl umwandeln und sie dann genau so senden konnten, wie wir es erwarten. Der Code wurde geändert in:

// Convert from a Unicode string to an array of bytes (encoded as UTF8).
byte[] source = Encoding.UTF8.GetBytes(unicode); 

// Send the encoded byte array directly! Do not send as a Unicode string.
MicrosoftFunc(source);

Zusammenfassung:

Aus den obigen Ausführungen können wir also schließen, dass:

  • GetBytes() führt unter anderem ein Encoding.Convert() von Unicode (weil Zeichenketten immer Unicode sind) und die angegebene Kodierung, von der aus die Funktion aufgerufen wurde, und gibt ein Array mit kodierten Bytes zurück.
  • GetString() führt unter anderem ein Encoding.Convert() von der angegebenen Kodierung, von der aus die Funktion aufgerufen wurde, nach Unicode durch (weil Zeichenketten immer Unicode sind) und gibt es als String-Objekt zurück.
  • Umrechnen() wandelt ein Byte-Array einer Kodierung in ein anderes Byte-Array einer anderen Kodierung um. Offensichtlich können Strings nicht verwendet werden (weil Zeichenketten immer Unicode sind) .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X