2013-06-07 12 views
8

Czy ktoś może mi wyjaśnić, jaki jest zakład różnicy. Kodowanie.UTF8.GetBytes i UTF8Encoding.Default.GetBytes? Faktycznie próbuję przekonwertować ciąg XML do obiektu strumienia i co teraz jest, gdy używam tej linii:Różnica między kodowaniem .UTF8.GetBytes i UTF8Encoding.Default.GetBytes

MemoryStream stream = new MemoryStream(UTF8Encoding.Default.GetBytes(xml)); 

wyskakuje mi błąd „System.Xml.XmlException: Nieprawidłowy znak w danym kodowaniu”

ale kiedy korzystać z tej linii to działa dobrze:

**MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xml));** 

choć wydaje się, że kodowanie UTF-8 w obu przypadkach jak ktoś pracuje, a druga nie?

Odpowiedz

12

Nie ma właściwości UTF8Encoding.Default. Kiedy to napiszesz, faktycznie zwracasz właściwość statyczną klasy podstawowej, Encoding.Default, która nie jest UTF8 (jest to domyślne kodowanie strony kodowej ANSI systemu).

Jako taki, dwa powróci bardzo różne rezultaty - od UTF8Encoding.Default jest rzeczywiście Encoding.Default, powrócisz samo jak w przypadku korzystania ASCIIEncoding.Default lub którykolwiek z pozostałych System.Text.Encoding podklasy.

Właściwym sposobem korzystania UTF8Encoding jest z instancją tworzoną, takich jak:

MemoryStream stream = new MemoryStream((new UTF8Encoding()).GetBytes(xml)); 

Powyższy powinny zapewnić takie same wyniki jak:

MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)); 
+0

Much; p (usunięty komentarz) –

+0

Edycja "Właściwość sposób użycia UTF8Encoding", aby być "Właściwym" ... nie pozwolił mi edytować, ponieważ jest to tylko zmiana 2 znaków. – Kevin

+0

@Kevin Dzięki - naprawiono –