Sehen Sie sich den folgenden C # -Code an (Funktion, die aus der Funktion BuildProtectedURLWithValidity
in Ссылка extrahiert wurde):
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?
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 hexadezimal0x0000
bis0xFFFF
und wird in einerChar
-Struktur gespeichert. Der Wert einesChar
-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:
Ja, Sie sollten stattdessen Encoding.UTF8.GetBytes
verwenden.
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.
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:
Ausgabe mit Überlaufprüfung:
%Vor%Ausgabe ohne Überlaufprüfung:
%Vor%Tags und Links c# character-encoding casting