2011-03-09 10 views
26

Tworzę XDocument tak:dlaczego Xdocument daje mi deklarację utf16?

XDocument doc = new XDocument(
new XDeclaration("1.0", "utf-8", "yes")); 

kiedy zapisać dokument tak (doc.Save(@"c:\tijd\file2.xml");), otrzymuję to:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 

których jest ok.

ale chcę wrócić zawartość jako XML i znalazłem następujący kod:

var wr = new StringWriter(); 
      doc.Save(wr); 
      string s = (wr.GetStringBuilder().ToString()); 

ten kod działa, ale wtedy string 's' zaczyna się tak:

<?xml version="1.0" encoding="utf-16" standalone="yes"?> 

więc zmieniło się z utf8 na utf16, i to nie jest to, czego chcę, ponieważ teraz nie mogę go odczytać w przeglądarce internetowej.

Czy istnieje sposób, aby temu zapobiec?

+2

Jest duża Red Flag tutaj, pisarz ciąg naprawdę nie zawierają ciąg zakodowany w UTF-16. Nawet jeśli zastąpisz właściwość Kodowania. Jak to się dzieje od StringWriter do IE? –

+0

Dobre pytanie. Zapisz ciąg 's' do pliku za pomocą File.WriteAllText, a następnie otwórz go za pomocą IE. Nie określiłem tego zbyt wyraźnie w moim pytaniu ... – Michel

+1

Dobrze, wywołanie File.WriteAllText() jest tym, * które * naprawdę * określa kodowanie. Domyślnie jest to utf-8, chyba że używasz przeciążenia, które pobiera kodowanie. –

Odpowiedz

36

StringWriter reklamuje się jako przy użyciu UTF-16. Łatwo jest go naprawić:

public class Utf8StringWriter : StringWriter 
{ 
    public override Encoding Encoding { get { return Encoding.UTF8; } } 
} 

To powinno wystarczyć w konkretnym przypadku. Raczej bardziej dobrze zaokrąglone wdrożenie mogłoby:

  • Czy konstruktorzy dopasowania tych w StringWriter
  • Pozwól kodowanie być określony w konstruktorze zbyt
+1

Ah ok, więc StringWriter czyni go UTF-16. Zawsze staram się zrozumieć kodowanie, ale po prostu nie wydaje się, żeby się trzymał. Brzmi logicznie, że obiekt UTF-16, taki jak stringwriter, tworzy ciąg znaków UTF-16, ale uderzyło mnie to, że zmienił także deklarację w pliku XML. Nie sądziłem, że był spowodowany przez StringWriter, ponieważ zawsze walczyłem z UTF-16, kiedy używałem XmlDocument przed XDocumentem, więc pomyślałem, że to po prostu nawyk .Net czy coś takiego. Dziękuję za odpowiedź! – Michel

+3

@Michel: Zasadniczo metoda Save * pyta * pisarza, jakie kodowanie użyć, aby używał tego, co jest właściwe. To trochę bałaganu, zgadzam się ... –

+0

dzięki za dodatkowe detialed informacji. – Michel

1

Musisz ustawić StreamWriter.Encoding używać UTF -8 zamiast Unicode (UTF-16)

Widząc, że nie jest to StreamWriter, ta odpowiedź jest tylko dla potomności.

+0

Nie ma tutaj włączonego StreamWriter. Jest tylko StringWriter i nie możesz programowo ustawić kodowania tego - musisz to zrobić poprzez dziedziczenie :( –

+0

Wow tak, całkowicie błędnie przeczytałem, co było używane. Dziedziczenie to jest. – msarchet

2

Bardzo dobra odpowiedź za pomocą dziedziczenia, ale należy pamiętać, aby zastąpić inicjatora

public class Utf8StringWriter : StringWriter 
    { 
     public Utf8StringWriter(StringBuilder sb) : base (sb) 
     { 
     } 
     public override Encoding Encoding { get { return Encoding.UTF8; } } 
    } 
Powiązane problemy