【问题标题】:Why is XmlWriter not honoring the encoding I set?为什么 XmlWriter 不遵守我设置的编码?
【发布时间】:2018-05-16 03:36:08
【问题描述】:

此方法正在写出一个 XML 文件(特定于工作)。除了我将它设置为使用 UTF-8(无 BOM)编码写入文件之外,我已经写出了我想要的所有内容。

XML 声明是 UTF-8,但是当我在 Notepad++ 中打开文件时,它显示为 ANSI 编码。

        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;
        settings.Encoding = new UTF8Encoding(false);
        settings.NewLineOnAttributes = true;


        using (var xmlWriter = XmlWriter.Create(@"c:\temp\myUIPB.xml", settings))
        {
            xmlWriter.WriteStartDocument();
            xmlWriter.WriteStartElement("UIScript");

            // Write Event Nodes
            foreach (var eventNode in listBoxOutput.Items)
            {
                lbEvent myNode = (lbEvent)eventNode;
                XmlNode xn = myNode.workflowEvent;
                xn.WriteTo(xmlWriter);
            }

            xmlWriter.WriteFullEndElement();
            xmlWriter.WriteEndDocument();
            xmlWriter.Flush();
            xmlWriter.Close();
        }

我希望如果我将其设置为以 UTF-8 输出,那么写出的文件确实是以 UTF-8 编码而不是 ANSI 编码的。

想法?帮助?

【问题讨论】:

  • 您选择使用new UTF8Encoding(false) 省略BOM。也许 XML 文件确实是用 utf8 编码的,但由于缺少 BOM,Notepad++ 猜测错误?如果您尝试在补充 Unicode 平面上发出汉字字符,例如 ?????它是正确编码还是转义?
  • 事实上,我在 github 上找到了 this,这似乎很相关:Notepad++ 无法知道内容编码,所以它必须猜测。它只看到 ASCII,因此它假定最小的公分母(在 Windows 上基本上是 ASCII + 外语扩展,例如 Windows-1252)。
  • 谢谢。我确实想知道 Notepad++ 是否弄错了,所以我在 Windows 记事本中交叉检查了它。它还给出了“ANSI”。
  • 您的文件中是否有任何不是 ANSI的字符?

标签: c# xml encoding utf-8 ansi


【解决方案1】:

如果文件只包含拉丁字符和数字,则使用 Utf8 且不包含 BOM 和 ascii 编码的文件看起来相同。

通用文本编辑程序(如记事本、notepad++)将能够猜测您喜欢的编码方式(除非您提供一些提示,通常使用“使用编码打开”文件打开选项)。

兼容的 XML 解析器使用“xml”PI (<?xml version="1.0" encoding="UTF-8"?>) 的“编码”部分来检测没有 BOM 的文件的正确编码。在您的情况下,您可能会获得正确的“xml”PI,并且兼容的 XML 解析器将正确打开它。

如果您需要所有程序正确检测 Utf8,请通过将 true 传递给编码构造函数来指定 BOM。

请注意,如果没有 BOM 文件,即使代码高于 128 的字符也可能会错误地检测到其编码。

【讨论】:

  • XML 有关于确定声明的编码的规则。但是,普通的文本编辑器并不了解 XML。 Notepad++ 插件确实有很多 XML 功能,但它们似乎无法帮助 Notepad++ 本身使用声明的编码。
  • 谢谢。我知道如果不是 UTF-8(没有 BOM),将读取我正在输出的文件的系统将无法正确读取它。它不应该使用任何代码高于 128 的字符。这是非常简单的东西。
  • 另外......关于给它一个“提示”。我认为这就是在没有 BOM 的情况下将编码设置为 UTF-8 所做的事情。有没有其他方法可以给它一个提示?
  • @kingtermite 如果您生成文件的任何工具都无法处理 BOM,那么它很有可能也会忽略 XML 指令中的编码(正如 Tom Blodget 评论的那样,encoding="..." 是兼容 XML 的方式如果没有 BOM,解析器应该选择编码)...因此,只要您所针对的工具正确解析了您获得的任何输出,就可以了...(我将编辑帖子以阐明 XML 与文本的区别)
  • 谢谢阿列克谢。你是对的。该文件实际上一直很好,系统读取它是合规的。我什至没有在系统中对其进行测试,因为我之前的经验让我相信,如果编码没有特别显示“UTF-8”(没有 BOM),它就不会工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
  • 2016-11-30
  • 2022-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多