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) .