Frage

Das folgende Stück Code (der Kürze halber snipped) erzeugt ein XML-Dokument, und spuckt sie in eine Datei aus. Wenn ich die Datei in Visual Studio öffnen erscheint es in chinesischen Schriftzeichen zu sein. Wenn ich es in Notepad öffnen sieht es aus wie erwartet. Wenn ich es richtig aussehen Console.WriteLine.

Ich weiß es zu Codierung verwendet ist, aber ich obwohl alle Codierung Enten Ich hatte in einer Reihe. Was fehlt?

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());
            }
War es hilfreich?

Lösung

Das Problem ist, dass Sie es gerade schreiben disk mit UTF-8, aber es wird Anspruch sein, UTF-16, weil das ist, was ein StringWriter standardmäßig verwendet -. und weil Sie explizit einstellen es Encoding.Unicode auch verwenden

Der einfachste Weg, dies zu beheben, ist ein String zu verwenden, die sich bewirbt als UTF-8:

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

... und entfernen Sie die settings.Encoding = Encoding.Unicode Linie. Auf diese Weise kann UTF-8 in ganz verwenden werden. (In der Tat, die Encoding Eigenschaft XmlWriterSettings ignoriert, wenn Sie die XmlWriter mit einem TextWriter sowieso erstellen.)

Wenn Sie wirklich wollen UTF-16, dann, wenn Sie die StreamWriter erstellen, geben Encoding.Unicode auch dort.

Andere Tipps

Ich bin mir nicht sicher, was Encoding.Unicode ist, aber ich denke, es ist UTF-16, die zwei Bytes pro Zeichen in die Datei schreibt. Für die normalen ASCII-Text, ist eines des Bytes immer 0.

Versuchen UTF-8 statt. Dies sollte das gleiche in einem beliebigen Editor aussehen, wenn Sie Sonderzeichen (mit einem Codepunkt> = 128).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top