在浏览器中打开 XML 时不支持从当前编码切换到指定编码

Switch from current encoding to specified encoding not supported when opening XML in browser

我试图在浏览器中打开一个 xml 文件,但出现以下错误:

不支持从当前编码切换到指定编码。处理资源时出错

现在我通过下面的代码使用 C# 生成这个 XML。我的 XML 有拉丁字符,所以我想编码为 ISO-8859-1 而不是 utf-16。但是每次我的 xml 生成时,它都采用 utf-16 编码而不是 ISO-8859-1。我想知道是什么原因和解决方法。

注意:我只需要 ISO-8859-1 而不是 utf-8 或 utf-16,因为如果编码是 ISO-8859-1,XML 会正确生成。

C#代码:

var doc = new XDocument(new XDeclaration("1.0", "iso-8859-1", "yes"),new XElement("webapp", new XAttribute("name", webApp.Name), new XAttribute("id", webApp.Id), Myinformation());
  var wr= new StringWriter();
            doc.Save(wr);
            return wr.ToString();

至少在概念上,字符串没有编码。它只是一系列 unicode 字符。也就是说,内存中的字符串本质上是 UTF-16,因此 StringWriter returns 来自它的 Encoding 属性.

你需要的是一个指定编码的编写器想要:

var doc = new XDocument(new XElement("root"));

byte[] bytes;

var isoEncoding = Encoding.GetEncoding("ISO-8859-1");

var settings = new XmlWriterSettings
{
    Indent = true,
    Encoding = isoEncoding
};

using (var ms = new MemoryStream())
{
    using (var writer = XmlWriter.Create(ms, settings))
    {
        doc.Save(writer);
    }
    bytes = ms.ToArray();
}

这将为您提供使用 ISO-8859-1 编码的二进制数据,因此声明将指定该编码。

您可以将其转换回字符串:

var text = isoEncoding.GetString(bytes);

但请注意,这不再以 ISO-8859-1 编码,它又只是一个字符串。您可以很容易地使用其他东西对其进行编码,并且您的声明是不正确的。

如果您确定要将其作为中间字符串,那么我建议您使用 the approach in this answer.