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
,我将其转换为string
。 xmlfile
包含整个 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的主要内容,如果未能解决你的问题,请参考以下文章
求个给UTF-8文件批量去UTF-8 BOM头的批处理,去掉BOM后覆盖原来的文件,最好我可以自己添加多个文件名称!