2011-03-09 1 views
26

Sto creando un XDocument come questo:perché Xdocument mi fornisce una dichiarazione utf16?

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

quando salvo il documento come questo (doc.Save(@"c:\tijd\file2.xml");), ottengo questo:

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

che è ok.

ma voglio restituire il contenuto in formato XML, e ho trovato il seguente codice:

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

questo codice funziona, ma poi '' s la stringa inizia con questo:

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

quindi è passato da utf8 a utf16, e non è quello che voglio, perché ora non riesco a leggerlo in internet explorer.

C'è un modo per prevenire questo comportamento?

+2

C'è una Red Flag Big qui, lo scrittore stringa fa davvero contenere una stringa UTF-16 codificato. Anche se si esegue l'override della proprietà Encoding. Come ottiene questo da StringWriter in IE? –

+0

Buona domanda. Salvare la stringa 's' in un file con File.WriteAllText e quindi aprirlo con IE. Non ho specificato che chiaramente nella mia domanda ... – Michel

+1

Esatto, la chiamata File.WriteAllText() è quella che * veramente * determina la codifica. Il valore predefinito è utf-8 a meno che non si utilizzi il sovraccarico che richiede una codifica. –

risposta

36

StringWriter si annuncia come UTF-16. E 'facile da risolvere però:

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

Questo dovrebbe essere sufficiente nel vostro caso particolare. Un'implementazione un po 'più a tutto tondo sarebbe:

  • avere costruttori corrispondenti a quelle in StringWriter
  • Lasciare la codifica da specificato nel costruttore troppo
+1

Ah ok, quindi StringWriter lo rende UTF-16. Cerco sempre di capire la roba di codifica, ma non sembra attaccare. Sembra logico che un oggetto UTF-16 come lo stringwriter crei una stringa UTF-16, ma ciò che mi ha colpito è che ha cambiato anche la dichiarazione nel file XML. Non pensavo che fosse causato da StringWriter, perché ero sempre alle prese con UTF-16 anche quando usavo XmlDocument prima di XDocument, quindi pensavo che fosse solo un'abitudine .Net o qualcosa del genere. Quindi grazie per la risposta! – Michel

+3

@Michel: Fondamentalmente il metodo Save * richiede * allo scrittore quale codifica usare, in modo che utilizzi qualsiasi cosa sia appropriata. È un po 'un casino, sono d'accordo ... –

+0

grazie per le informazioni extra detial. – Michel

1

Sarà necessario impostare il StreamWriter.Encoding da utilizzare UTF -8 invece di Unicode (UTF-16)

Visto che non è un StreamWriter, questa risposta è lasciata solo ai posteri.

+0

Non ci sono StreamWriter coinvolti qui. C'è solo un StringWriter e non puoi impostare la codifica in modo programmatico, devi farlo via ereditarietà :( –

+0

Wow sì, ho completamente frainteso ciò che è stato utilizzato. Eredità lo è. – msarchet

2

Molto buona risposta utilizzando l'ereditarietà, basta ricordarsi di ignorare l'inizializzazione

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