UTF-8 删除 BOM

Posted

技术标签:

【中文标题】UTF-8 删除 BOM【英文标题】:UTF-8 remove 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/BOM 和How do I ignore the UTF-8 Byte Order Marker in String comparisons? 所示。更好的是,您可以将StreamReader 直接传递给XmlReader,避免浪费中间xmlstring 表示。或者将包含字节的MemoryStream 传递给也应该消耗BOM 的XmlReader XML 文件保存为 xmlfile,稍后转换为 xmlstring 作为字符串。你能从中删除BOM字符吗? 【参考方案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);

【讨论】:

以上是关于UTF-8 删除 BOM的主要内容,如果未能解决你的问题,请参考以下文章

使用 Perl 从字符串中删除 BOM

求个给UTF-8文件批量去UTF-8 BOM头的批处理,去掉BOM后覆盖原来的文件,最好我可以自己添加多个文件名称!

Vim 删除 BOM 标记的方法

用CS02删除BOM后可以恢复吗?

unix环境下shell脚本如何往文本文件的头部加入utf8 bom头EEBBBF?如何删除bom

SAP中怎么删除BOM组件中的其中一个组件,点删除显示已被分配给任务清单删除不了怎么办?