2009-10-09 3 views

risposta

5

vedere la risposta su come specificare la codifica 's il TextWriter.

A parte: ISO-8859-1 è un set di caratteri, non una codifica. Unicode è anche un set di caratteri, ma UTF-16 è una codifica del set di caratteri Unicode in una sequenza di byte. Non è possibile specificare la codifica di un documento come ISO-8859-1, così come non è possibile specificare il set di caratteri di un documento come UTF-16. Si noti che Unicode è il set di caratteri nativi e UTF-16 è la codifica nativa Unicode per le classi .NET e Java String e le operazioni basate su testo o basate su stringhe.

+1

Ciò significa che non è possibile specificare una codifica non valida utilizzando XDocument? Sto inoltrando XML a una terza parte che richiede la dichiarazione errata . –

+0

Sono sicuro che puoi. Quale sistema è conforme all'uso corretto, al linguaggio e alle specifiche? – yfeldblum

1

Verificare la codifica del TextWriter che si sta utilizzando. Vedi here.

Se il collegamento sopra riportato non funziona, è possibile che sia disponibile Google cache versionhere.

+4

Il link "qui" non funziona. Puoi fornire la soluzione nella tua risposta o trovare un altro post sul blog che spiega come modificare la proprietà 'Encoding' di un' TextWriter'? –

3

Come detto, l'implementazione di scrittura XML/Stream .NET "preleva" o interpreta la codifica da qualche parte diversa dalla codifica XML dichiarata. Ho testato con successo una soluzione di lavoro, come descritto l'URL contenuto nel precedente Stackoverflow post

XDocument xmlDoc = new XDocument(
     new XDeclaration("1.0", "utf-8", "no"), 
     new XElement("foo", "bar")); 

MemoryStream memstream = new MemoryStream(); 
XmlTextWriter xmlwriter = new XmlTextWriter(memstream, new UTF8Encoding()); 

//'Write' (save) XDocument XML to MemoryStream-backed XmlTextWriter instance 
xmlDoc.Save(xmlwriter); 

//Read back XML string from stream 
xmlwriter.Flush();  
memstream.Seek(0, SeekOrigin.Begin); //OR "stream.Position = 0" 
StreamReader streamreader = new StreamReader(memstream); 
string xml = streamreader.ReadToEnd(); 

Console.WriteLine(xml); 
Console.WriteLine(reader.ReadToEnd()); 

Spero che questo aiuta qualcuno.

Acclamazioni

1

che in qualche modo non riesco a trovare alcuna risposta lavorare qui, ecco una soluzione reale che sarà in uscita la codifica desiderato nell'intestazione:

private void CreateXml() 
    {  
     XmlTextWriter xmlwriter = new XmlTextWriter("c:\\test.xml", Encoding.GetEncoding("iso-8859-1"));   

     XDocument xdoc = new XDocument(
      new XElement("Test") 
     ); 

     xdoc.Save(xmlwriter); 
     xmlwriter.Close(); 
    } 

Il motivo per cui si stanno ottenendo UTF -16 è che le stringhe sono codificate con UTF-16 in memoria e finché non si specifica una codifica per l'output dell'XML, esso sovrascriverà la codifica nell'intestazione XML in modo che corrisponda alla codifica effettiva utilizzata. L'utilizzo di un XmlTextWriter è un metodo per specificare una codifica diversa.

È anche possibile lasciare scrivere a MemoryStream e quindi trasformarlo nuovamente in string se è necessario eseguire l'intera operazione in memoria.