Pregunta

Estoy tratando de crear un archivo de texto usando VB.Net con codificación UTF-8, sin lista de materiales. Alguien me puede ayudar, cómo hacer esto?
Puedo escribir archivo con codificación UTF-8, pero, cómo quitar Byte marca de orden de ella?

edit1: He tratado de 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 crean sólo con codificación UTF-8 y 2.html se crea con formato de codificación ANSI.

enfoque simplificado - http: // whatilearnttuday .blogspot.com / 2011/10 / escritura de texto sin archivos-byte-order.html

¿Fue útil?

Solución

Con el fin de omitir la marca de orden de bytes (BOM), su flujo debe utilizar una instancia de UTF8Encoding que no sea System.Text.Encoding.UTF8 (que está configurado para generar una lista de materiales). Hay dos formas fáciles de hacer esto:

1. especificar explícitamente una codificación adecuada:

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

  2. Pase el ejemplo UTF8Encoding al constructor corriente.

' 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. El uso de la codificación predeterminada:

Si no se proporciona un Encoding al constructor de StreamWriter en absoluto, StreamWriter por defecto usará una codificación UTF-8 sin BOM, por lo que el 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("...");
}

Por último, cabe destacar que la omisión de la lista de materiales sólo es permisible para UTF-8, no para UTF-16.

Otros consejos

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

Sólo Sólo tiene que utilizar el método de WriteAllText System.IO.File.

Por favor, compruebe la muestra de File.WriteAllText .

  

Este método utiliza codificación UTF-8 sin un orden de bytes Marcos (BOM), por lo   utilizando el método GetPreamble devolverá una matriz de bytes vacía. Si esto es   necesario incluir un identificador de UTF-8, tal como una marca de orden de byte, en   el comienzo de un archivo, utilice el WriteAllText (String, String,   Encoding) sobrecarga del método con codificación UTF8.

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

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

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

Así que para crear un archivo de texto sin el uso de la lista de materiales de los constructores que no requieren que proporcione una codificación:

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

Creo romana Nikitin es correcto. El significado del argumento del constructor se da la vuelta. False significa ninguna lista de materiales y medios verdaderos con la lista de materiales.

Se 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 los que "Hola" cadena y verá el cambio de codificación ANSI sin-BOM.

Codificación XML UTF-8 sin BOM
Tenemos que enviar datos XML a la EPA y su aplicación que toma nuestra entrada requiere UTF-8 sin BOM. Oh, sí, sin formato UTF-8 debe ser aceptable para todos, pero no para la EPA. La respuesta a esto es hacer en los comentarios anteriores. Gracias Romano Nikitin .

Aquí hay un fragmento de C # el código de 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();  
    }    

Para ver si esto en realidad elimina estos tres caracteres que va desde el archivo de salida puede ser engañoso. Por ejemplo, si utiliza Notepad ++ (www.notepad-plus-plus.org), informará “Codificar en ANSI”. Creo que la mayoría de los editores de texto están contando con los personajes de lista de materiales de decir si es UTF-8. La manera de ver claramente esto es con una herramienta binaria como WinHex (www.winhex.com). Como yo estaba buscando una diferencia antes y después he utilizado el Microsoft WinDiff aplicación.

Puede ser que el texto de entrada contiene 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)

LE OTORGA resultados que los que quiere (creo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top