我试过但没有功能,我想编码没有BOM,但选择false仍然编码在带有BOM的utf-8中。
这是我的代码
System.Text.Encoding outputEnc = new System.Text.UTF8Encoding(false);
return File(outputEnc.GetBytes(" <?xml version=\"1.0\" encoding=\"utf-8\"?>" + xmlString), "application/xml", id);
答案 0 :(得分:1)
这个问题已有两年多了,但我找到了答案。您在输出中看到BOM的原因是您的输入中有一个BOM 。 XML声明开头似乎是一个空格实际上是一个BOM后跟一个空格。要证明这一点,请从XML编码中选择文本" <
(开头双引号,后面的空格和开头<
字符)并将其粘贴到任何告诉您Unicode代码点的工具中。例如,将该文本粘贴到http://www.babelstone.co.uk/Unicode/whatisit.html中会给我以下结果:
U+0022 : QUOTATION MARK
U+FEFF : ZERO WIDTH NO-BREAK SPACE [ZWNBSP] (alias BYTE ORDER MARK [BOM])
U+0020 : SPACE [SP]
U+003C : LESS-THAN SIGN
您还可以复制并粘贴我在此答案中添加的" <
:我从您的问题中复制了这些字符,因此它们在空格字符之前包含隐形BOM。
这就是为什么我经常将BOM称为BOM(b) - 因为它静静地坐在那里,隐藏,等待你最不期望的时候爆炸。您正确使用System.Text.UTF8Encoding(false)
。它没有添加BOM,但是您复制并粘贴XML的源包含一个BOM,所以无论如何你的输出中都有一个,因为你的输入中有一个。
个人咆哮:将BOM放在UTF-8编码文本之外是一个非常好的主意。然而,一些破碎的工具(微软,我看着你,因为你是最多的人),如果它不包含BOM,就会误解文本,因此向UTF-8编码文本添加BOM有时需要 。但是应该尽可能地避免它。 UTF-8现在是Internet的事实上的默认编码,因此任何编码未知的文本文件都应该被解析为UTF-8 first ,然后回退到&# 34;遗留&#34;只有在将文档解析为UTF-8失败时才会编码,例如Windows-1252,Latin-1等。