2011-01-06 12 views
29

Sto aprendo un file XML esistente con C# e sostituisco alcuni nodi. Tutto funziona bene. Subito dopo averlo salvato, ho i seguenti caratteri all'inizio del file:Ottenere "ï" ¿"all'inizio del file XML dopo il salvataggio()

 (EF BB BF in HEX) 

Tutta la prima linea:

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

Il resto del file si presenta come un normale file XML. Il codice semplificato è qui:

XmlDocument doc = new XmlDocument(); 
doc.Load(xmlSourceFile); 
XmlNode translation = doc.SelectSingleNode("//trans-unit[@id='127']"); 
translation.InnerText = "testing"; 
doc.Save(xmlTranslatedFile); 

sto usando un'applicazione C# Windows Forms con .NET 4.0.

Qualche idea? Perché dovrebbe farlo? Possiamo disabilitarlo in qualche modo? È per Adobe InCopy e non lo apre in questo modo.

UPDATE: soluzione alternativa:

Salvataggio con XmlTextWriter lavora troppo:

XmlTextWriter writer = new XmlTextWriter(inCopyFilename, null); 
doc.Save(writer); 
+0

Vedere questo [post] (http://stackoverflow.com/questions/1755958/how-can-i-remove-bom-from-xmltextwriter-using-c) qui - Jon Skeet spiega come usare rimuovere la BOM quando si salva il tuo XMLDocument, se è quello di cui hai bisogno. – StuartLC

risposta

38

È la UTF-8 BOM, che in realtà è scoraggiato dallo standard Unicode:

http://www.unicode.org/versions/Unicode5.0.0/ch02.pdf

uso di una distinta non è richiesto né raccomandato per UTF-8, ma può essere incontrato in contesti in cui UTF 8- dati vengono convertiti da altre codifica moduli che utilizzano una distinta o dove BOM viene utilizzato come firma UTF-8

È possibile disattivare utilizzando:

var sw = new IO.StreamWriter(path, new System.Text.UTF8Encoding(false)); 
doc.Save(sw); 
sw.Close(); 
+0

Huh, non ho mai saputo che fosse scoraggiato ... se lo è, allora in che modo i programmi dovrebbero rilevare le codifiche? – Mehrdad

+0

@Lambert: XML specifica una codifica nell'intestazione o (mancante) è UTF-8 per impostazione predefinita. –

+1

@Lambert: * per UTF-8 * è la parte chiave della frase.Se tu * conosci * è utf-8 allora non c'è nessun problema, nessun problema di endianità. Le probabilità di leggere un file xml codificato in utf-16be senza un bom sono ancora zilch, anche se è dichiarato nell'istruzione di elaborazione. –

0

si può provare a cambiare la codifica del XmlDocument. Qui di seguito è l'esempio copiato da MSDN

using System; using System.IO; using System.Xml; 

public class Sample { 

    public static void Main() { 

    // Create and load the XML document. 
    XmlDocument doc = new XmlDocument(); 
    string xmlString = "<book><title>Oberon's Legacy</title></book>"; 
    doc.Load(new StringReader(xmlString)); 

    // Create an XML declaration. 
    XmlDeclaration xmldecl; 
    xmldecl = doc.CreateXmlDeclaration("1.0",null,null); 
    xmldecl.Encoding="UTF-16"; 
    xmldecl.Standalone="yes";  

    // Add the new node to the document. 
    XmlElement root = doc.DocumentElement; 
    doc.InsertBefore(xmldecl, root); 

    // Display the modified XML document 
    Console.WriteLine(doc.OuterXml); 

    } 

}

+1

XML codificato UTF-16. Che schifo! – dalle

0

Come tutti gli altri accennato, è problema Unicode.

Ti consiglio di provare LINQ To XML. Anche se non molto correlato, lo menziono perché è super facile rispetto ai vecchi metodi e, cosa più importante, presumo che potrebbe avere risoluzioni automatiche per problemi come questi senza dover codificare ulteriormente.

Problemi correlati