2010-03-13 21 views
109

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 archivos con codificación UTF8 pero, ¿cómo eliminar la marca de orden de bytes?
¿Escribir archivos de texto sin marca de orden de byte (BOM)?

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

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

+8

Si no quiere una lista de materiales, ¿por qué está escribiendo GetPreamble()? –

Respuesta

189

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 maneras fáciles de hacerlo:

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

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

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

' 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-StreamWriter 's constructor en absoluto, StreamWriter por defecto usará una codificación UTF-8 sin Lista de materiales, entonces 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 la omisión de la lista de materiales solo está permitida para UTF-8, no para UTF-16.

+0

No siempre es sabio: por ejemplo 'My.Computer.FileSystem.WriteAllText' escribe la lista de materiales si no se especifica ninguna codificación. – beppe9000

+0

'My.Computer.FileSystem.WriteAllText' es una excepción en este sentido, ¿es posible adivinar la compatibilidad con versiones anteriores de VB? ['File.WriteAllText'] (http://referencesource.microsoft.com/#mscorlib/system/io/file.cs,10d1f3f4dbac8234) se establece por defecto en UFT8NoBOM. – jnm2

-1

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

+1

Por favor, ayúdenme. Cómo eliminarlo antes de escribir. –

+0

@ user180326 ¿El lector predeterminado ya no lo ha filtrado? – binki

28

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 
4

Nota interesante con respecto a esto: extrañamente, el método estático "CreateText()" de la clase System.IO.File crea ficheros UTF-8 sin lista de materiales.

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

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

le da resultados como los que quiere (creo).

+1

En mi PC crea archivos ANSI – Muflix

3

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 igual que un archivo ANSI. Pruebe algunos caracteres especiales en su cadena "hola allí" y verá que la codificación ANSI cambia a sin BOM.

5

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

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á un conjunto de bytes vacía. Si es necesario incluir un identificador UTF-8, como una marca de orden de bytes, en al comienzo de un archivo, utilice la sobrecarga del método WriteAllText (String, String, ) con codificación UTF8.

+0

El que está en el espacio de nombres My usa BOM – beppe9000

4

Si no se especifica un Encoding al crear un nuevo StreamWriter la Encoding objeto predeterminado que se utiliza 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 necesidad de utilizar 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) 
+0

¿Qué ocurre si necesito especificar 'leaveOpen'? – binki

+0

@binki, en ese caso no puede usar la codificación predeterminada que utiliza 'StreamWriter'. Tendrá que especificar 'new UTF8Encoding (false, true)' para que su codificación pueda especificar 'leaveOpen' y no tenga la BOM. –

1

codificación XML UTF-8 sin BOM
Tenemos que presentar Los datos XML para la EPA y su aplicación que requiere nuestra información requieren UTF-8 sin lista de materiales. 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í es 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 los tres personaje principal 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 estaba buscando una diferencia antes y después, utilicé la aplicación Microsoft WinDiff.

Cuestiones relacionadas