Estoy tratando de 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 probado un 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
vb.net
encoding
file-handling
byte-order-mark
Vijay Balkawade
fuente
fuente
Respuestas:
Para omitir la marca de orden de bytes (BOM), su flujo debe usar una instancia
UTF8Encoding
diferente aSystem.Text.Encoding.UTF8
(que está configurada para generar una BOM). Hay dos formas sencillas de hacer esto:1. Especificar explícitamente una codificación adecuada:
Llame al
UTF8Encoding
constructor conFalse
para elencoderShouldEmitUTF8Identifier
parámetro.Pase la
UTF8Encoding
instancia al constructor de la secuencia.2. Usando la codificación predeterminada:
Si no proporciona un constructor de
Encoding
toStreamWriter
en absoluto,StreamWriter
utilizará de forma predeterminada una codificación UTF8 sin BOM, por lo que lo siguiente debería funcionar igual de bien:Finalmente, tenga en cuenta que omitir la lista de materiales solo está permitido para UTF-8, no para UTF-16.
fuente
My.Computer.FileSystem.WriteAllText
escribe la lista de materiales si no se especifica ninguna codificación.My.Computer.FileSystem.WriteAllText
¿Es una excepción en este sentido, adivinando la compatibilidad con versiones anteriores de VB quizás?File.WriteAllText
por defecto es UFT8NoBOM.Prueba esto:
fuente
Simplemente use el método
WriteAllText
deSystem.IO.File
.Consulte la muestra de File.WriteAllText .
fuente
Nota interesante con respecto a esto: extrañamente, 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 :)
fuente
Si no especifica un
Encoding
al crear uno nuevo,StreamWriter
elEncoding
objeto predeterminado utilizado es elUTF-8 No BOM
que se crea mediantenew UTF8Encoding(false, true)
.Entonces, para crear un archivo de texto sin el uso de BOM de los constructores que no requieren que proporciones una codificación:
fuente
leaveOpen
?StreamWriter
usa. Deberá especificarnew UTF8Encoding(false, true)
que su codificación pueda especificarleaveOpen
y no tener la lista de materiales.Creo que Roman Nikitin tiene razón. El significado del argumento del constructor se invierte. Falso significa que no hay lista de materiales y verdadero significa con lista de materiales.
Obtiene una codificación ANSI porque un archivo sin una lista de materiales que no contiene caracteres no ansi es exactamente lo mismo que un archivo ANSI. Pruebe algunos caracteres especiales en su cadena "hola" y verá que la codificación ANSI cambia a sin BOM.
fuente
Codificación XML UTF-8 sin BOM
Necesitamos enviar datos XML a la EPA y su aplicación que toma 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 .
A continuación, se muestra un fragmento de código C # para la codificación XML:
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". Supongo que la mayoría de los editores de texto cuentan con los caracteres 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 un antes y un después, utilicé la aplicación Microsoft WinDiff .
fuente
Es posible que su texto de entrada contenga una marca de orden de bytes. En ese caso, debe eliminarlo antes de escribir.
fuente
Te da resultados como los que quieres (creo).
fuente