【问题标题】:UTF-8 remove BOMUTF-8 删除 BOM
【发布时间】:2021-12-21 10:46:50
【问题描述】:

我有一个 XML 文件,文件开头带有 UTF-8 BOM,这妨碍了我使用现有代码读取 UTF-8 文件。

如何轻松地从 XML 文件中删除 BOM?

这里我有一个Byte 类型的变量xmlfile,我将其转换为stringxmlfile 包含整个 XML 文件。

 byte[] xmlfile = ((Byte[])myReader["xmlSQL"]);

 string xmlstring = Encoding.UTF8.GetString(xmlfile);

【问题讨论】:

  • 您显示的代码根本不使用XMLReader - 该代码是否失败,或者是您未向我们显示的某些代码?异常是什么样的?无论如何,我希望 XMLReader 能够处理 BOM...
  • 对不起,好问题。没有 xmlreader 只是读取 xml 文件内容以查找命名空间的函数的一部分。效果很好,我的问题是我无法读取 utf-8bom 文件。因为文件前面的这些字符。所以我需要删除那些,以便我可以使用 xmlreader。所以它可以使用 xmlfile 作为字节或 xmlstring 作为字符串来删除 BOM
  • 请编辑您的问题,使其更加更清晰。理想情况下,提供minimal reproducible example。 “我无法读取 utf-8bom 文件”确实没有为我们提供几乎关于您所面临的错误的足够信息。请参阅codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question 获取有关如何写出好问题的建议。
  • 不要使用Encoding.UTF8.GetString,而是使用StreamReader,它会自动消耗BOM。如Encoding.UTF8.GetString doesn't take into account the Preamble/BOMHow do I ignore the UTF-8 Byte Order Marker in String comparisons? 所示。更好的是,您可以将StreamReader 直接传递给XmlReader,避免浪费中间xmlstring 表示。或者将包含字节的MemoryStream 传递给也应该消耗BOM 的XmlReader
  • XML 文件保存为 xmlfile,稍后转换为 xmlstring 作为字符串。你能从中删除BOM字符吗?

标签: c# xml utf-8


【解决方案1】:

很棒的东西 DBC :) 与您的链接配合得很好。为了解决我在 xml 文件开头有一个 UTF-8 BOM 标记的问题。我只是添加了 memorystream 和 streamreader,它们会自动清理 BOM 元素的 xmlfile(htmlbytes)。 对现有代码非常容易实现。

 byte[] htmlbytes = ((Byte[])myReader["xmlMelding"]);
 var memorystream = new MemoryStream(htmlbytes);
 var s = new StreamReader(memorystream).ReadToEnd();

【讨论】:

    【解决方案2】:

    Encoding.GetString() 有一个overload,它接受byte[] 数组的偏移量。只需检查数组是否以 BOM 开头,如果是则在调用 GetString() 时跳过它,例如:

    byte[] xmlfile = ((Byte[])myReader["xmlSQL"]);
    int offset = 0;
    
    if (xmlfile.Length >= 3 &&
        xmlfile[0] == 0xEF &&
        xmlfile[1] == 0xBB &&
        xmlfile[1] == 0xBF)
    {
        offset += 3;
    }
    
    string xmlstring = Encoding.UTF8.GetString(xmlfile, offset, xmlfile.Length - offset);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-08
      • 2012-05-04
      • 2018-10-28
      • 2017-12-27
      • 1970-01-01
      相关资源
      最近更新 更多