Warum ist der XmlWriter immer die Ausgabe von utf-16-Codierung?
Habe ich diese extension-Methode
public static string SerializeObject<T>(this T value)
{
var serializer = new XmlSerializer(typeof(T));
var settings = new XmlWriterSettings
{
Encoding = new UTF8Encoding(true),
Indent = false,
OmitXmlDeclaration = false,
NewLineHandling = NewLineHandling.None
};
using(var stringWriter = new StringWriter())
{
using(var xmlWriter = XmlWriter.Create(stringWriter, settings))
{
serializer.Serialize(xmlWriter, value);
}
return stringWriter.ToString();
}
}
aber immer wenn ich Anruf das es eine Codierung von utf-16
angegeben, dh <?xml version="1.0" encoding="utf-16"?>
. Was mache ich falsch?
- möglich, Duplikat der Wie man ein encoding-Attribut der xml-andere, utf-16 mit XmlWriter?
- Ich habe realisiert, dass dies ein dupe, also Abstimmung zu schließen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Strings sind UTF-16, also schreiben, um einen StringWriter verwendet immer UTF-16. Wenn das ist nicht, was Sie wollen, dann verwenden einige andere
TextWriter
abgeleitete Klasse, die mit der Kodierung, die Sie mögen.StringWriter
, so ist standardmäßig Unicode (UTF-16) . Wenn ichusing(var xmlWriter = XmlWriter.Create("MyFile.xml", settings)
und eine manuellexmlWriter.WriteStartElement("SomeRootElement"); xmlWriter.WriteEndElement();
, dann laden Sie Sie zurück in:XmlDocument xml = new XmlDocument(); xml.Load("MyFile.xml"); byte[] bytes = Encoding.Default.GetBytes(xml.OuterXml); string xmlDoc = Encoding.Default.GetString(bytes);
ist es UTF-8 - nur zur info, dass Sie es dump in eine Datei und Lesen Sie es zurück, löschen Sie dann die Datei. Nutzen Sie alternativStringWriter
geben Sie einfachEncoding.UTF8
.Soweit ich weiß, StringWriter-Klasse verwendet immer UTF-16-Kodierung bei der Serialisierung von string. Schreiben Sie Ihre eigene überschreiben, Klasse, akzeptiert eine unterschiedliche Codierung:
So können Sie diese stattdessen zu verwenden:
Sollten Sie eine neue Klasse ableiten, aus StringWriter die eine überschreiben-encoding-Eigenschaft.
Als die akzeptierte Antwort sagt:
StringWriter
ist UTF-16 (Unicode) Standard und design. Wenn Sie wollen, es zu tun, indem man einen UTF-8 string, der in der Ende, gibt es 2 Möglichkeiten, die ich Ihnen geben kann, um es getan:Lösung #1 (nicht sehr effizient, schlechte Praxis, aber bekommt den job getan): Dump in eine Textdatei und Lesen Sie es zurück, löschen Sie die Datei (wahrscheinlich nur geeignet für kleine Dateien, wenn Sie wollen sogar, das zu tun - wollte nur zeigen, dass es getan werden könnte!)
Lösung #2 (bessere, einfachere und elegantere Lösung!): Machen Sie es wie Sie es haben, verwenden
StringWriter
, aber verwenden seineEncoding
- Eigenschaft, um es zu UTF-8:Wenn Sie nicht wollen, um eine Klasse verwenden, leitet sich aus
StringWriter
, dann in deinem Fall, könnte man einfach dieOmitXmlDeclaration
zufalse
und erklären Ihre eigene, genau wie ich unten:als @john-saunders erwähnt in seiner Antwort:
So habe ich MemoryStream für diese Zwecke.
In meinem Fall habe ich mit windows-1251 Kodierung.