Domanda

Il seguente pezzo di codice (frammentato per brevità) genera un documento xml e lo sputa in un file. Se apro il file in Visual Studio, sembra che sia in caratteri cinesi. Se lo apro in Blocco note, sembra come previsto. Se I Console.WriteLine sembra corretto.

So che è legato alla codifica, ma ho pensato di avere tutte le anatre di codifica di fila. Cosa manca?

StringBuilder stringBuilder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.Unicode;
settings.Indent = true; 
settings.IndentChars = "\t";
using (XmlWriter textWriter = XmlWriter.Create(new StringWriter(stringBuilder), settings))
{
    textWriter.WriteStartElement("Submission");
    textWriter.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
    textWriter.WriteEndElement();
}

using (StreamWriter sw = new StreamWriter(new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)))
            {
                sw.Write(stringBuilder.ToString());
            }
È stato utile?

Soluzione

Il problema è che lo stai scrivendo su disco usando UTF-8, ma rivendicherà come UTF-16 perché è quello che StringWriter utilizza per impostazione predefinita - e poiché lo stai impostando esplicitamente per utilizzare anche Encoding.Unicode .

Il modo più semplice per risolvere questo problema è utilizzare StringWriter che si pubblicizza come UTF-8:

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

... e quindi rimuovere la riga settings.Encoding = Encoding.Unicode . In questo modo utilizzerai UTF-8 per tutto. (In effetti, la proprietà Encoding di XmlWriterSettings viene ignorata quando si crea XmlWriter con un TextWriter .)

Se davvero vuoi UTF-16, quando crei StreamWriter , specifica anche Encoding.Unicode .

Altri suggerimenti

Non sono sicuro di cosa sia Encoding.Unicode ma suppongo sia UTF-16 che scrive due byte per carattere nel file. Per il normale testo ASCII, uno dei byte è sempre 0.

Prova invece UTF-8 . Dovrebbe apparire lo stesso in qualsiasi editor a meno che tu non usi caratteri speciali (con un punto di codice > = 128).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top