Warum Encoding.Default nicht verwendet werden sollte ...
@ Randalls Antwort verwendet Encoding.Default
, aber Microsoft warnt davor :
Verschiedene Computer können standardmäßig unterschiedliche Codierungen verwenden, und die Standardcodierung kann sich auf einem einzelnen Computer ändern. Wenn Sie die Standardcodierung verwenden, um Daten zu codieren und zu decodieren, die zwischen Computern gestreamt oder zu unterschiedlichen Zeiten auf demselben Computer abgerufen werden, werden diese Daten möglicherweise falsch übersetzt. Darüber hinaus verwendet die von der Default-Eigenschaft zurückgegebene Codierung den Best-Fit-Fallback, um nicht unterstützte Zeichen Zeichen zuzuordnen, die von der Codepage unterstützt werden. Aus diesen Gründen wird die Verwendung der Standardcodierung nicht empfohlen. Um sicherzustellen, dass codierte Bytes ordnungsgemäß decodiert werden, sollten Sie eine Unicode-Codierung verwenden, z. B. UTF8Encoding oder UnicodeEncoding. Sie können auch ein übergeordnetes Protokoll verwenden, um sicherzustellen, dass für die Codierung und Decodierung dasselbe Format verwendet wird.
Verwenden Sie Encoding.Default.WindowsCodePage
(in meinem Fall 1250 - und leider gibt es keine vordefinierte Klasse der CP1250-Codierung, aber das Objekt kann als abgerufen werden Encoding.GetEncoding(1250)
), um die Standardcodierung zu überprüfen .
Encoding.ASCII
ist 7bit, also funktioniert es auch nicht, in meinem Fall:
byte[] pass = Encoding.ASCII.GetBytes("šarže");
Console.WriteLine(Encoding.ASCII.GetString(pass)); // ?ar?e
... und warum stattdessen UTF-8-Codierung verwendet werden sollte ...
Die Standardcodierung ist irreführend: .NET verwendet UTF-8 überall als Standard (8-Bit-Codierungen sind Ende des 20. Jahrhunderts veraltet, überprüfen Sie dh Console.OutputEncoding.EncodingName
*), sodass jede im Code definierte Konstante standardmäßig UTF-8-codiert ist Dieser sollte verwendet werden, es sei denn, die Datenquelle hat eine andere Codierung.
* Dies ist in meinem Fall UTF-8, was eine direkte Lüge ist: chcp
Von der Windows-Konsole (cmd) wird 852 zurückgegeben - und dies sollte nicht geändert werden, da bei lokalisierten Systembefehlen (wie Ping) diese Codepage fest codiert ist
Befolgen Sie die Empfehlung von Microsoft:
var utf8 = new UTF8Encoding();
byte[] pass = utf8.GetBytes("šarže");
Console.WriteLine(utf8.GetString(pass)); // šarže
Encoding.UTF8
Von anderen empfohlen wird eine Instanz der UTF-8-Codierung, die auch direkt oder als verwendet werden kann
var utf8 = Encoding.UTF8 as UTF8Encoding;
... aber es wird nicht immer verwendet
Die Codierung für Byte-Arrays sollte in westlichen Ländern in Unicode "nur funktionieren". Sobald Sie Ihr Programm jedoch in weniger unterstützte Regionen (wie hier in Osteuropa) verschieben, ist dies ein echtes Chaos: In der Tschechischen Republik wird Windows standardmäßig verwendet (im Jahr 2020!) MS nicht Standard 852 (auch bekannt als Latin-2) für Konsole, 1250 als Windows OEM, UTF-8 (65001) als .NET (und andere) neuer Standard und wir sollten bedenken, dass einige westliche EU 8bit Daten sind noch im Jahr 1252, während der alte 8-Bit-Weststandard für Osteuropa ISO-8859-2 war (auch bekannt als Latin-2, aber NICHT das gleiche Latin-2 wie 852). Die Verwendung von ASCII bedeutet Text voller Tofu und '?' Hier. Stellen Sie UTF-8 also bis zur Hälfte des 21. Jahrhunderts explizit ein .
searchResult.Properties["user"][0]
? Versuchen Sie esbyte[]
zuerst zu