vb.net - ¿Escribir archivos de texto sin marca de orden de bytes(BOM)?
encoding file-handling (9)
Intento crear un archivo de texto usando VB.Net con codificación UTF8, sin BOM. ¿Alguien puede ayudarme, cómo hacer esto?
Puedo escribir un archivo con codificación 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 codificación UTF8 solamente y 2.html se crea con formato de codificación ANSI.
Enfoque simplificado: http://whatilearnttuday.blogspot.com/2011/10/write-text-files-without-byte-order.html
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 codificación 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 codificación ANSI cambia a sin BOM.
Es posible que su texto de entrada contenga una marca de orden de bytes. En ese caso, debe eliminarlo antes de escribir.
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 :)
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 codificación adecuada:
Llame al constructor
UTF8Encoding
conFalse
para el parámetroencoderShouldEmitUTF8Identifier
.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 codificación predeterminada:
Si no proporciona ningún tipo de Encoding
al constructor de StreamWriter
, StreamWriter
utilizará de manera predeterminada una codificación 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
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 codificación:
new StreamWriter(Stream)
new StreamWriter(String)
new StreamWriter(String, Boolean)
Simplemente utilice el método WriteAllText
de System.IO.File
.
Por favor, compruebe la muestra de File.WriteAllText .
Este método utiliza la codificación 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 codificación UTF8.
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 codificación 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 .
Dim sWriter As IO.StreamWriter = New IO.StreamWriter(shareworklist & "/" & getfilename() & ".txt", False, Encoding.Default)
Te da resultados como los que quieres (creo).