2010-03-13 15 views
109

Sto provando a creare un file di testo usando VB.Net con la codifica UTF8, senza BOM. Qualcuno può aiutarmi, come farlo?
Posso scrivere file con codifica UTF8 ma, come rimuovere Byte Order Mark da esso?
Scrive i file di testo senza il contrassegno dell'ordine byte (BOM)?

edit1: Ho provato codice come questo;

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 vengono creati solo con la codifica UTF-8 e 2.html vengono creati con il formato di codifica ANSI.

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

+8

Se non si desidera un BOM, perché si scrive GetPreamble()? –

risposta

189

Al fine di omettere il segno di ordine di byte (BOM), il vostro flusso deve utilizzare un'istanza di UTF8Encoding diverso System.Text.Encoding.UTF8 (che è configurato per generare un BOM). Ci sono due semplici modi per farlo:

1. specificare esplicitamente una codifica adeguata:

  1. Chiamare il UTF8Encoding constructor con False per il parametro encoderShouldEmitUTF8Identifier.

  2. Passare l'istanza UTF8Encoding al costruttore stream.

' 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. Utilizzando la codifica di default:

Se non si forniscono un costruttore Encoding-StreamWriter s' a tutti, StreamWriter per impostazione predefinita utilizzare una codifica UTF-8 senza BOM, quindi il seguente dovrebbe funzionare altrettanto bene:

// C#: 
using (var sink = new StreamWriter("Foobar.txt")) 
{ 
    sink.WriteLine("..."); 
} 

Infine, si noti che l'omissione della distinta base è consentita solo per UTF-8, non per UTF-16.

+0

Non sempre consigliabile: ad esempio 'My.Computer.FileSystem.WriteAllText' scrive la distinta materiali se non viene specificata alcuna codifica. – beppe9000

+0

'My.Computer.FileSystem.WriteAllText' è un'eccezione a questo proposito, supponendo forse una compatibilità VB a ritroso? ['File.WriteAllText'] (http://referencesource.microsoft.com/#mscorlib/system/io/file.cs.10d1f3f4dbac8234) per impostazione predefinita UFT8NoBOM. – jnm2

-1

È possibile che il testo di input contenga un contrassegno di ordine byte. In tal caso, dovresti rimuoverlo prima di scrivere.

+1

Per favore aiutatemi. Come rimuoverlo prima di scrivere. –

+0

@ user180326 il lettore predefinito non lo ha già filtrato per te? – binki

28

Prova questo:

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 interessante rispetto a questo: stranamente, il metodo statico "CreateText()" della classe System.IO.File crea UTF-8 file senza BOM.

In generale questo la fonte di bug, ma nel tuo caso potrebbe essere stata la soluzione più semplice :)

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

ti dà risultati come quelli che si desidera (credo).

+1

Sul mio PC crea file ANSI – Muflix

3

Penso che Roman Nikitin abbia ragione. Il significato dell'argomento del costruttore è capovolto.Falso significa nessun BOM e veri mezzi con BOM.

Si ottiene una codifica ANSI perché un file senza un BOM che non contiene caratteri non ansi è esattamente uguale a un file ANSI. Prova alcuni caratteri speciali nella stringa "hi there" e vedrai la codifica ANSI cambiare in senza BOM.

5

Basta utilizzare semplicemente il metodo WriteAllText da System.IO.File.

Si prega di controllare il campione da File.WriteAllText.

Questo metodo utilizza UTF-8 codifica senza un Byte Order Mark (BOM), così utilizzando il metodo GetPreamble restituirà un array di byte vuoto. Se è necessario includere un identificatore UTF-8, ad esempio un segno di ordinamento dei byte, a l'inizio di un file, utilizzare l'overload del metodo WriteAllText (String, String, Encoding) con la codifica UTF8.

+0

Quello dal Mio spazio dei nomi utilizza BOM – beppe9000

4

Se non si specifica un Encoding quando si crea una nuova StreamWriter l'Encoding oggetto predefinito utilizzato è UTF-8 No BOM che si crea tramite new UTF8Encoding(false, true).

in modo da creare un file di testo senza l'uso BOM dei dei costruttori che non richiedono di fornire una codifica:

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

Cosa devo fare se devo specificare 'leaveOpen'? – binki

+0

@binki in tal caso non è possibile utilizzare la codifica predefinita utilizzata da 'StreamWriter'. Dovrai specificare 'new UTF8Encoding (false, true)' affinché la tua codifica sia in grado di specificare 'leaveOpen' e non avere la BOM. –

1

codifica XML UTF-8 senza BOM
Abbiamo bisogno di presentare I dati XML per l'EPA e la loro applicazione che accetta i nostri input richiede UTF-8 senza BOM. Oh sì, l'UTF-8 dovrebbe essere accettabile per tutti, ma non per l'EPA. La risposta a questo è nei commenti sopra. Grazie Roman Nikitin.

Ecco un C# frammento di codice per la codifica 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(); 
    }  

per vedere se questo rimuove in realtà i tre protagonista dal file di output può essere fuorviante. Ad esempio, se si utilizza Notepad ++ (www.notepad-plus-plus.org), verrà segnalato "Encode in ANSI". Credo che la maggior parte degli editor di testo contano sui caratteri della distinta base per dire se è UTF-8. Il modo per vedere chiaramente questo è con uno strumento binario come WinHex (www.winhex.com). Poiché stavo cercando una differenza prima e dopo ho usato l'applicazione Microsoft WinDiff.

Problemi correlati