写文本文件没有字节顺序标记(BOM) ? ?

我正在尝试使用带 UTF8编码的 VB.Net 创建一个文本文件,没有 BOM。谁能帮帮我,怎么做?
我可以用 UTF8编码写文件,但是,如何从它删除字节顺序标记?

编者: 我尝试过这样的代码;

    Dim utf8 As New UTF8Encoding()
Dim utf8EmitBOM As New UTF8Encoding(True)
Dim strW As New StreamWriter("c:\temp\bom\1.html", True, utf8EmitBOM)
strW.Write(utf8EmitBOM.GetPreamble())
strW.WriteLine("hi there")
strW.Close()


Dim strw2 As New StreamWriter("c:\temp\bom\2.html", True, utf8)
strw2.Write(utf8.GetPreamble())
strw2.WriteLine("hi there")
strw2.Close()

1.html 仅使用 UTF8编码创建,2.html 使用 ANSI 编码格式创建。

简化方法 -http://whatilearnttuday.blogspot.com/2011/10/write-text-files-without-byte-order.html

88714 次浏览

为了省略字节顺序标记(byte order mark,BOM) ,您的流必须使用 UTF8Encoding的实例,而不是 System.Text.Encoding.UTF8(它被配置为生成 BOM)。有两种简单的方法可以做到这一点:

1. 明确指定适当的编码:

  1. 对于 encoderShouldEmitUTF8Identifier参数,使用 False调用 UTF8Encoding构造函数

  2. UTF8Encoding实例传递给流构造函数。

' VB.NET:
Dim utf8WithoutBom As New System.Text.UTF8Encoding(False)
Using sink As New StreamWriter("Foobar.txt", False, utf8WithoutBom)
sink.WriteLine("...")
End Using
// C#:
var utf8WithoutBom = new System.Text.UTF8Encoding(false);
using (var sink = new StreamWriter("Foobar.txt", false, utf8WithoutBom))
{
sink.WriteLine("...");
}

2. Using the default encoding:

如果你根本没有为 StreamWriter的构造函数提供 Encoding,那么 StreamWriter默认使用的是没有 BOM 的 UTF8编码,所以下面的代码应该也可以正常工作:

' VB.NET:
Using sink As New StreamWriter("Foobar.txt")
sink.WriteLine("...")
End Using
// C#:
using (var sink = new StreamWriter("Foobar.txt"))
{
sink.WriteLine("...");
}

最后,请注意,只有 UTF-8允许省略 BOM,而 UTF-16不允许省略 BOM。

输入文本可能包含一个字节顺序标记。在这种情况下,您应该在写入之前删除它。

试试这个:

Encoding outputEnc = new UTF8Encoding(false); // create encoding with no BOM
TextWriter file = new StreamWriter(filePath, false, outputEnc); // open file with encoding
// write data here
file.Close(); // save and close it

关于这一点有趣的注意: 奇怪的是,System.IO.File 类的静态“ CreateText ()”方法创建 UTF-8文件 没有 BOM。

一般来说,这是 bug 的来源,但在您的情况下,这可能是最简单的解决方案:)

Dim sWriter As IO.StreamWriter = New IO.StreamWriter(shareworklist & "\" & getfilename() & ".txt", False, Encoding.Default)

给你想要的结果(我认为)。

I think Roman Nikitin is right. The meaning of the constructor argument is flipped. False means no BOM and true means with BOM.

得到 ANSI 编码是因为没有 BOM 但不包含非 ANSI 字符的文件与 ANSI 文件完全相同。在您的“ hi there”字符串中尝试一些特殊字符,您将看到 ANSI 编码更改为 without-BOM。

只需简单地使用来自 System.IO.File的方法 WriteAllText

请检查 文件的样品。

此方法使用不带字节顺序标记(Byte-Order Mark,BOM)的 UTF-8编码,因此 使用 GetPreamble 方法将返回一个空字节数组 包含 UTF-8标识符(例如字节顺序标记)所必需的 在文件的开头,使用 WriteAllText (String,String, 方法重载,使用 UTF8编码。

如果在创建新的 StreamWriter时没有指定 Encoding,则默认使用的 Encoding对象是通过 new UTF8Encoding(false, true)创建的 UTF-8 No BOM

So to create a text file without the BOM use of of the constructors that do not require you to provide an encoding:

new StreamWriter(Stream)
new StreamWriter(String)
new StreamWriter(String, Boolean)

无 BOM 编码 UTF-8
我们需要向 EPA 提交 XML 数据,而接受我们输入的 EPA 应用程序需要没有 BOM 的 UTF-8。是的,普通的 UTF-8对每个人来说都是可以接受的,但是对环保局来说就不行了。这样做的答案在上面的评论中。谢谢。

下面是 XML 编码的 C # 代码片段:

    Encoding utf8noBOM = new UTF8Encoding(false);
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = utf8noBOM;
…
using (XmlWriter xw = XmlWriter.Create(filePath, settings))
{
xDoc.WriteTo(xw);
xw.Flush();
}

要查看这是否真的从输出文件中删除了三个前导字符,可能会产生误导。例如,如果您使用 记事本 + + ( www.notepad-plus-plus.org ) ,它将报告“ Encode in ANSI”。我猜想大多数文本编辑器都指望 BOM 字符来判断它是否是 UTF-8。要清楚地看到这一点,可以使用 WinHex这样的二进制工具(www.winhe.com)。因为我正在寻找一个之前和之后的差异,我使用了微软 WinDiff应用程序。

For VB.Net visual basic, this is how to make it work:

My.Computer.FileSystem.WriteAllText("FileName", Data, False, System.Text.Encoding.ASCII)