Problema con XDocument e la distinta base (Byte Order Mark)
-
03-07-2019 - |
Domanda
Esiste un modo per produrre il contenuto di un documento X senza la distinta base? Quando legge l'output con Flash, causa errori.
Soluzione
Se stai scrivendo l'XML con un XmlWriter, puoi impostare la codifica su una che è stata inizializzata per escludere la DBA.
EG: il costruttore di System.Text.UTF8Encoding accetta un valore booleano per specificare se si desidera la distinta base, quindi:
XmlWriter writer = XmlWriter.Create("foo.xml");
writer.Settings.Encoding = new System.Text.UTF8Encoding(false);
myXDocument.WriteTo(writer);
Crea un XmlWriter con codifica UTF-8 e senza il Byte Order Mark.
Altri suggerimenti
Leggera mod alla risposta di Chris Wenham.
Non è possibile modificare la codifica una volta creato XmlWriter, ma è possibile impostarlo utilizzando XmlWriterSettings durante la creazione di XmlWriter
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = new System.Text.UTF8Encoding(false);
XmlWriter writer = XmlWriter.Create("foo.xml", settings);
myXDocument.WriteTo(writer);
Non ho potuto aggiungere un commento sopra, ma se qualcuno usa il suggerimento di Chris Wenham, ricordati di eliminare lo scrittore! Ho trascorso un po 'di tempo a chiedermi perché il mio output fosse stato troncato, e questa era la ragione.
Suggerisci un utilizzando (XmlWriter ...) {...}
passa al suggerimento di Chris
Una specie di combinazione di post, forse qualcosa del genere:
MemoryStream ms = new MemoryStream();
StreamWriter writer = new StreamWriter(ms, new UTF8Encoding(false));
xmlDocument.Save(writer);
Come detto, questo problema ha un cattivo odore.
Secondo questa nota di supporto , Flash utilizza il BOM per chiarire la differenza tra UTF-16BE e UTF-16LE, che è come dovrebbe essere. Quindi non dovresti ricevere un errore da Flash: XDocument produce XML ben formato codificato UTF16 e Macromedia afferma che Flash può leggere XML ben formato codificato UTF16.
Questo mi fa sospettare che qualunque sia il problema che stai riscontrando, probabilmente non è causato dalla DBA. Se fossi in me, scaverei di più, con l'aspettativa che il problema reale sia altrove.
Probabilmente potresti usare System.Text.Encoding.Convert () sull'output; Proprio come qualcosa da provare, non qualcosa che ho testato.
Convertilo in una stringa, quindi rimuovi il segno da solo.