Codierung, die bei der Umwandlung von char in Byte verwendet wird

7

Sehen Sie sich den folgenden C # -Code an (Funktion, die aus der Funktion BuildProtectedURLWithValidity in Ссылка extrahiert wurde):

%Vor%

Meine Frage ist: Was bewirkt das Umwandeln von Byte zu Zeichen in Bezug auf die Codierung?

Ich nehme an, dass es wirklich nichts mit Encoding zu tun hat, aber das bedeutet, dass der Encoding.Default der ist, der verwendet wird, und das zurückzugebende Byte davon abhängt, wie das Framework die zugrunde liegende Zeichenfolge im spezifischen Operativen codiert System?

Und außerdem, ist das Zeichen tatsächlich größer als ein Byte (ich vermute 2 Bytes) und wird das erste Byte tatsächlich weglassen?

Ich habe daran gedacht, all das zu ersetzen durch:

%Vor%

Was denkst du?

    
Mariano Desanze 22.05.2012, 19:13
quelle

3 Antworten

14

Das .NET Framework verwendet Unicode, um alle seine Zeichen und Zeichenfolgen darzustellen. Der ganzzahlige Wert eines Zeichens (das Sie durch das Umwandeln in int erhalten können) entspricht seiner UTF-16-Codeeinheit. Für Zeichen in der Basic Multilingual Plane (die die Mehrheit der Zeichen ausmachen, die Ihnen jemals begegnen werden), ist dieser Wert der Unicode-Codepunkt.

  

Das .NET Framework verwendet die Char -Struktur, um ein Unicode-Zeichen darzustellen. Der Unicode-Standard identifiziert jedes Unicode-Zeichen mit einer eindeutigen 21-Bit-Skalarzahl, die als Codepunkt bezeichnet wird, und definiert die UTF-16-Codierungsform, die angibt, wie ein Codepunkt in eine Folge von einem oder mehreren 16-Bit-Werten codiert wird. Jeder 16-Bit-Wert reicht von hexadezimal 0x0000 bis 0xFFFF und wird in einer Char -Struktur gespeichert. Der Wert eines Char -Objekts ist der numerische 16-Bit-Wert (Ordinalwert). - Char-Struktur

Wenn char auf byte umgesetzt wird, führt dies zu Datenverlusten für jedes Zeichen, dessen Wert größer als 255 ist. Versuchen Sie, das folgende einfache Beispiel auszuführen, um zu verstehen, warum:

%Vor%

Ja, Sie sollten stattdessen Encoding.UTF8.GetBytes verwenden.

    
Douglas 22.05.2012, 19:18
quelle
4

Casting zwischen byte und char ist vergleichbar mit der ISO-8859-1 Codierung (= die ersten 256 Zeichen von Unicode), außer dass bei der Codierung von Zeichen jenseits von U + 00FF automatisch Informationen verloren gehen.

  

Und außerdem, ist das Zeichen tatsächlich größer als ein Byte (ich vermute 2 Bytes) und wird das erste Byte tatsächlich weglassen?

Ja. Eine C # char = UTF-16-Code-Einheit = 2 Bytes.

    
dan04 22.05.2012 19:26
quelle
1

char repräsentiert einen 16-Bit-UTF-16-Codepunkt. Das Umwandeln von char in byte führt zum unteren Byte des Zeichens, aber sowohl Douglas als auch dan04 sind falsch, da es das höhere Byte immer ruhig verwerfen wird . Wenn das höhere Byte nicht Null ist, hängt das Ergebnis davon ab, ob die Compileroption Auf arithmetischen Überlauf / Unterlauf überprüfen gesetzt ist:

%Vor%

Ausgabe mit Überlaufprüfung:

%Vor%

Ausgabe ohne Überlaufprüfung:

%Vor%     
Ant_222 17.06.2017 17:03
quelle

Tags und Links