代码之家  ›  专栏  ›  技术社区  ›  Chris

保存XML文档时,它忽略XML声明(utf8)中的编码并使用utf16

  •  22
  • Chris  · 技术社区  · 14 年前

    我有以下代码:

    var doc = new XmlDocument();
    
    XmlDeclaration xmlDeclaration = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
    doc.AppendChild(xmlDeclaration);
    
    XmlElement root = doc.CreateElement("myRoot");
    doc.AppendChild(root);
    root.InnerText = "myInnerText";
    
    StringWriter sw = new StringWriter();
    doc.Save(sw);
    Console.WriteLine(sw.ToString());
    
    Console.WriteLine();
    
    MemoryStream ms = new MemoryStream();
    doc.Save(ms);
    Console.WriteLine(Encoding.ASCII.GetString(ms.ToArray()));
    

    下面是输出:

    <?xml version="1.0" encoding="utf-16"?>
    <myRoot>myInnerText</myRoot>
    
    ???<?xml version="1.0" encoding="UTF-8"?>
    <myRoot>myInnerText</myRoot>
    

    基本上,它所做的就是生成一个XML文件,并将编码设置为utf8,但是当它保存到StringWriter时,它会忽略我的编码并使用utf16。但是,当使用内存流时,它使用utf8(带有额外的bom字符)

    这是为什么?为什么它不尊重我明确的UTF-8编码设置?

    谢谢

    3 回复  |  直到 14 年前
        1
  •  29
  •   vcsjones    14 年前

    因为您所要做的只是设置一个XML元素,该元素表示它是UTF-8,所以实际上并没有将其保存为UTF-8。您需要将输出流设置为使用UTF-8,如下所示:

    var doc = new XmlDocument();
    XmlElement root = doc.CreateElement("myRoot");
    doc.AppendChild(root);
    root.InnerText = "myInnerText";
    using(TextWriter sw = new StreamWriter("C:\\output.txt", false, Encoding.UTF8)) //Set encoding
    {
        doc.Save(sw);
    }
    

    一旦您这样做了,您甚至不需要添加XML声明。它自己解决。如果要将其保存到memorystream,请使用包装memorystream的streamwriter。

        2
  •  4
  •   djunod    7 年前

    我用下面的方法,写得很漂亮 作为UTF-8

    public static string Beautify(XmlDocument doc)
    {
        string xmlString = null;
        using (MemoryStream ms = new MemoryStream()) {
            XmlWriterSettings settings = new XmlWriterSettings {
                Encoding = new UTF8Encoding(false),
                Indent = true,
                IndentChars = "  ",
                NewLineChars = "\r\n",
                NewLineHandling = NewLineHandling.Replace
            };
            using (XmlWriter writer = XmlWriter.Create(ms, settings)) {
                doc.Save(writer);
            }
            xmlString = Encoding.UTF8.GetString(ms.ToArray());
        }
        return xmlString;
    }
    

    称之为:

    File.WriteAllText(fileName, Utilities.Beautify(xmlDocument));
    
        3
  •  2
  •   Pace    14 年前

    the MSDN 我们可以看到…

    文本编写器上的编码决定了写出的编码(xmlDeclaration节点的编码替换为文本编写器的编码)。如果在文本编写器上没有指定编码,则保存XML文档时不带编码属性。

    如果要使用来自xmlDeclaration的编码,则需要使用流来保存文档。