¿Escribir archivos de texto sin marca de orden de bytes (BOM)?

Intento crear un archivo de texto usando VB.Net con encoding UTF8, sin BOM. ¿Alguien puede ayudarme, cómo hacer esto?
Puedo escribir un archivo con encoding UTF8 pero, ¿cómo eliminar la marca de orden de bytes?

edit1: He intentado código como este;

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 se crea con encoding UTF8 solamente y 2.html se crea con formato de encoding ANSI.

Enfoque simplificado: http://whatilearnttuday.blogspot.com/2011/10/write-text-files-without-byte-order.html

Para omitir la marca de orden de bytes (BOM), la transmisión debe usar una instancia de UTF8Encoding no sea System.Text.Encoding.UTF8 (que está configurado para generar una lista de materiales). Hay dos formas sencillas de hacer esto:

1. Especificación explícita de una encoding adecuada:

  1. Llame al constructor UTF8Encoding con False para el parámetro encoderShouldEmitUTF8Identifier .

  2. Pase la instancia de UTF8Encoding al constructor de flujo.

 ' 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. Usando la encoding predeterminada:

Si no proporciona ningún tipo de Encoding al constructor de StreamWriter , StreamWriter utilizará de manera predeterminada una encoding UTF8 sin lista de materiales, por lo que lo siguiente debería funcionar igual de bien:

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

Finalmente, tenga en cuenta que omitir la lista de materiales solo es permisible para UTF-8, no para UTF-16.

Prueba esto:

 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 

Simplemente utilice el método WriteAllText de System.IO.File .

Por favor, compruebe la muestra de File.WriteAllText .

Este método utiliza la encoding UTF-8 sin una marca de orden por bytes (BOM), por lo que usar el método GetPreamble devolverá una matriz de bytes vacía. Si es necesario incluir un identificador UTF-8, como una marca de orden de bytes, al comienzo de un archivo, utilice la sobrecarga del método WriteAllText (String, String, Encoding) con encoding UTF8.

Nota interesante con respecto a esto: curiosamente, el método estático “CreateText ()” de la clase System.IO.File crea archivos UTF-8 sin BOM.

En general, esta es la fuente de errores, pero en su caso podría haber sido la solución más simple 🙂

Si no especifica una Encoding al crear un nuevo StreamWriter el objeto de Encoding predeterminado utilizado es UTF-8 No BOM que se crea a través de una new UTF8Encoding(false, true) .

Entonces, para crear un archivo de texto sin el uso de BOM de los constructores que no requieren que proporcione una encoding:

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

Creo que Roman Nikitin tiene razón. El significado del argumento constructor se invierte. Falso significa que no hay BOM y que es cierto con BOM.

Obtiene una encoding ANSI porque un archivo sin una lista de materiales que no contiene caracteres no ansi es exactamente el mismo que un archivo ANSI. Pruebe algunos caracteres especiales en su cadena “hola allí” y verá que la encoding ANSI cambia a sin BOM.

XML que codifica UTF-8 sin BOM
Necesitamos presentar datos XML a la EPA y su aplicación que requiere nuestra entrada requiere UTF-8 sin BOM. Oh sí, el UTF-8 simple debería ser aceptable para todos, pero no para la EPA. La respuesta para hacer esto está en los comentarios anteriores. Gracias Roman Nikitin .

Aquí hay un fragmento de C # del código para la encoding XML:

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

Ver si esto realmente elimina los tres caracteres principales del archivo de salida puede ser engañoso. Por ejemplo, si usa Notepad ++ (www.notepad-plus-plus.org), informará “Codificar en ANSI”. Creo que la mayoría de los editores de texto cuentan con los caracteres de la BOM para saber si es UTF-8. La forma de ver esto claramente es con una herramienta binaria como WinHex (www.winhex.com). Como buscaba una diferencia antes y después, utilicé la aplicación Microsoft WinDiff .

Es posible que su texto de entrada contenga una marca de orden de bytes. En ese caso, debe eliminarlo antes de escribir.

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

Te da resultados como los que quieres (creo).