在没有BOM的c#utf-8中对文本进行编码

本文关键字:文本 编码 c#utf-8 BOM | 更新日期: 2023-09-27 18:21:11

我尝试过,但没有起作用,我想在没有BOM的情况下编码,但在utf-8中使用选项false仍然使用BOM编码。

这是我的代码

System.Text.Encoding outputEnc = new System.Text.UTF8Encoding(false);
                return File(outputEnc.GetBytes(" <?xml version='"1.0'" encoding='"utf-8'"?>" + xmlString), "application/xml", id);

在没有BOM的c#utf-8中对文本进行编码

这个问题已经两年多了,但我已经找到了答案。您在输出中看到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是一个非常好的主意。然而,如果文本不包含BOM,一些破损的工具(微软,我看着你,因为你是制作最多的工具)会误解文本,因此有时需要在UTF-8编码的文本中添加BOM。但实际上应该尽可能避免。UTF-8现在是事实上的互联网默认编码,因此任何编码未知的文本文件都应该首先被解析为UTF-8,只有在将文档解析为UTF-8失败的情况下,才返回到Windows-1252、Latin-1等"传统"编码。