können diese XML-Codierung Leiden verstehen
-
05-07-2019 - |
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());
}
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).