Dlaczego nie należy używać Encoding.Default ...
Odpowiedź @ Randall używa Encoding.Default
, jednak Microsoft podnosi ostrzeżenie :
Różne komputery mogą używać różnych kodowań jako domyślnych, a domyślne kodowanie może ulec zmianie na jednym komputerze. Jeśli użyjesz domyślnego kodowania do kodowania i dekodowania danych przesyłanych strumieniowo między komputerami lub pobieranych w różnych momentach na tym samym komputerze, może to niepoprawnie tłumaczyć te dane. Ponadto kodowanie zwrócone przez właściwość Default korzysta z najlepszego dopasowania rezerwowego do mapowania nieobsługiwanych znaków na znaki obsługiwane przez stronę kodową. Z tych powodów użycie domyślnego kodowania nie jest zalecane. Aby upewnić się, że zakodowane bajty są poprawnie dekodowane, należy użyć kodowania Unicode, takiego jak UTF8Encoding lub UnicodeEncoding. Możesz także użyć protokołu wyższego poziomu, aby upewnić się, że ten sam format jest używany do kodowania i dekodowania.
Aby sprawdzić, jakie jest domyślne kodowanie, użyj Encoding.Default.WindowsCodePage
(1250 w moim przypadku - i niestety nie ma predefiniowanej klasy kodowania CP1250, ale obiekt można pobrać jako Encoding.GetEncoding(1250)
).
Encoding.ASCII
jest 7-bitowy, więc też nie działa, w moim przypadku:
byte[] pass = Encoding.ASCII.GetBytes("šarže");
Console.WriteLine(Encoding.ASCII.GetString(pass)); // ?ar?e
... i dlaczego zamiast tego należy zastosować kodowanie UTF-8 ...
Domyślne kodowanie jest mylące: .NET używa UTF-8 wszędzie jako prawdziwego domyślnego (kodowania 8-bitowe stały się przestarzałe pod koniec XX wieku, sprawdź np. Console.OutputEncoding.EncodingName
*), Więc każda stała zdefiniowana w kodzie jest domyślnie kodowana w UTF-8 - więc należy tego użyć, chyba że źródło danych jest w innym kodowaniu.
* To jest UTF-8 w moim przypadku, które jest bezpośrednim kłamstwem: chcp
z konsoli Windows (cmd) zwraca 852 - i nie należy tego zmieniać, ponieważ zlokalizowane polecenia systemowe (takie jak ping) mają tę stronę kodową na stałe
Zgodnie z zaleceniami Microsoft:
var utf8 = new UTF8Encoding();
byte[] pass = utf8.GetBytes("šarže");
Console.WriteLine(utf8.GetString(pass)); // šarže
Encoding.UTF8
zalecany przez innych jest przykładem uf kodowania UTF-8 i może być również używany bezpośrednio lub jako
var utf8 = Encoding.UTF8 as UTF8Encoding;
... ale nie zawsze jest używane
Kodowanie tablic bajtowych powinno „po prostu działać” w Unicode w krajach zachodnich, ale jak tylko przeniesiesz swój program do niektórych mniej obsługiwanych regionów (jak tutaj w Europie Wschodniej), to jest prawdziwy bałagan: w Czechach domyślne ustawienia systemu Windows (w 2020 roku!) MS niestandardowe 852 (aka Latin-2) na konsolę, 1250 jako Windows OEM, UTF-8 (65001) jako .NET (i inne) nowe domyślne i powinniśmy pamiętać, że niektóre zachodnie 8-bitowe UE dane wciąż są w 1252, podczas gdy starym 8-bitowym zachodnim standardem dla Europy Wschodniej był ISO-8859-2 (aka Latin-2, ale NIE taki sam Latin-2 jak 852). Używanie ASCII oznacza tekst pełen tofu i „?” tutaj. Tak więc do połowy XXI wieku ustaw wyraźnie UTF-8 .
searchResult.Properties["user"][0]
? Spróbuj rzucić go nabyte[]
pierwszym