Я пытаюсь создать текстовый файл с помощью VB.Net с кодированием UTF8 без BOM. Кто-либо может помочь мне, как сделать это?
Я могу записать файл с кодированием UTF8, но, как удалить Порядок байтов Mark из него?
edit1: Я попробовал код как это;
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
Чтобы опустить метку порядка байтов (BOM), ваш поток должен использовать экземпляр UTF8Encoding
отличный от System.Text.Encoding.UTF8
(который настроен на генерацию BOM). Есть два простых способа сделать это:
1. Явное указание подходящей кодировки:
Вызов конструктора UTF8Encoding
с False
для параметра encoderShouldEmitUTF8Identifier
.
Передайте экземпляр 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. Использование кодировки по умолчанию:
Если вы вообще не передадите Encoding
в конструктор StreamWriter
, StreamWriter
по умолчанию будет использовать кодировку UTF8 без BOM, поэтому следующее должно работать так же хорошо:
' VB.NET:
Using sink As New StreamWriter("Foobar.txt")
sink.WriteLine("...")
End Using
// C#:
using (var sink = new StreamWriter("Foobar.txt"))
{
sink.WriteLine("...");
}
Наконец, обратите внимание, что опускание BOM допустимо только для UTF-8, но не для UTF-16.
Возможно, введенный текст содержит метку порядка байтов. В этом случае вы должны удалить его перед написанием.
Попробуйте следующее:
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