XmlWriter编码问题

问题描述 投票:6回答:5

我有以下代码:

    MemoryStream ms = new MemoryStream();
    XmlWriter w = XmlWriter.Create(ms);

    w.WriteStartDocument(true);
    w.WriteStartElement("data");

    w.WriteElementString("child", "myvalue");

    w.WriteEndElement();//data
    w.Close();
    ms.Close();

    string test = UTF8Encoding.UTF8.GetString(ms.ToArray());

XML正确生成;但是,我的问题是字符串'test'的第一个字符是ï(字符#239),使其对某些xml解析器无效:这是哪里来的?我到底在做什么错?

[我知道我可以通过在第一个字符之后开始来解决问题,但我宁愿知道为什么会在那里,而不是简单地解决问题。

谢谢!

.net xml encoding xmlwriter
5个回答
13
投票

在这里找到一个解决方案:https://timvw.be/2007/01/08/generating-utf-8-with-systemxmlxmlwriter/

我在顶部缺少此位置:

XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
xmlWriterSettings.Encoding = new UTF8Encoding(false);
MemoryStream ms = new MemoryStream();
XmlWriter w = XmlWriter.Create(ms, xmlWriterSettings);

感谢大家的帮助!


2
投票

问题是,当您使用UTF-8将其转换为字符串时,编写器生成的XML为UTF-16。请尝试以下方法:

StringBuilder sb = new StringBuilder();
using (StringWriter writer = new StringWriter(sb))
using (XmlWriter w = XmlWriter.Create(writer))
{
    w.WriteStartDocument(true);
    w.WriteStartElement("data");

    w.WriteElementString("child", "myvalue");

    w.WriteEndElement();//data
}

string test = sb.ToString();


0
投票

您可以像这样更改编码:

w.Settings.Encoding = Encoding.UTF8;

0
投票

如果您关心编辑器使用的字节顺序标记(例如Visual Studio检测到UTF8编码的XML和正确突出显示语法),所有这些都会略有不同。

这里是解决方法:

MemoryStream stream = new MemoryStream();

XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
settings.Indent = true;
settings.IndentChars = "\t";

using (XmlWriter writer = XmlWriter.Create(stream, settings))
{
    // ... write

    // Make sure you flush or you only get half the text
    writer.Flush();

    // Use a StreamReader to get the byte order correct
    StreamReader reader = new StreamReader(stream,Encoding.UTF8,true);
    stream.Seek(0, SeekOrigin.Begin);
    result = reader.ReadToEnd();
}

我有2个完整的here代码段>

© www.soinside.com 2019 - 2024. All rights reserved.