Domanda

Sto cercando di creare un file di testo utilizzando VB.Net con la codifica UTF-8 senza BOM. Qualcuno mi può aiutare, come fare questo?
Posso scrivere file con UTF8 codifica, ma, come rimuovere Byte Order Mark da esso?

Edit1: Ho provato il 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 get creato solo con la codifica UTF-8 e 2.html ottenere creato con formato di codifica ANSI.

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

È stato utile?

Soluzione

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

1. specificando esplicitamente una codifica adatto:

  1. riferimento UTF8Encoding costruttore con False per il parametro encoderShouldEmitUTF8Identifier.

  2. Far passare l'istanza UTF8Encoding al costruttore flusso.

' 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 fornisce un Encoding al costruttore di StreamWriter affatto, StreamWriter per impostazione predefinita utilizzare una codifica UTF-8 senza BOM, quindi il seguente dovrebbe funzionare altrettanto bene:

' VB.NET:
Using sink As New StreamWriter("Foobar.txt")
    sink.WriteLine("...")
End Using
// C#:
using (var sink = new StreamWriter("Foobar.txt"))
{
    sink.WriteLine("...");
}

Infine, ricordiamo che omettendo il BOM è consentito solo per UTF-8, non per UTF-16.

Altri suggerimenti

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

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

Si prega di verificare il campione da File.WriteAllText .

  

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

Nota interessante rispetto a questo:. Stranamente, la statica "CreateText ()" metodo della classe System.IO.File crea file UTF-8 senza BOM

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

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

Quindi, per creare un file di testo senza l'uso di BOM dei costruttori che non richiedono di fornire una codifica:

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

Credo che Roman Nikitin è giusto. Il significato della argomento del costruttore è capovolto. False mezzi senza BOM e vero mezzo con BOM.

Si ottiene una codifica ANSI, perché un file senza una distinta base che non contiene caratteri non ANSI è esattamente la stessa come un file ANSI. Prova alcuni caratteri speciali in te "Ciao" stringa e vedrete il cambiamento di codifica ANSI a senza-BOM.

Codifica XML UTF-8 senza BOM
Abbiamo bisogno di inviare i dati XML per l'EPA e la loro applicazione che prende il nostro input richiede UTF-8 senza BOM. Oh sì, pianura UTF-8 dovrebbe essere accettabile per tutti, ma non per l'EPA. La risposta a questa operazione è nei commenti di cui 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 caratteri che conduce dal file di output può essere fuorviante. Per esempio, se si utilizza Notepad ++ (www.notepad-plus-plus.org), segnalerà “Codifica in ANSI”. Credo che la maggior parte degli editor di testo contano sui caratteri BOM per dire se è UTF-8. Il modo di vedere chiaramente questo è con uno strumento binario come WinHex (www.winhex.com). Dal momento che ero alla ricerca di un prima e dopo differenza che ho usato il Microsoft WinDiff applicazione.

Potrebbe essere che il testo di input contiene un contrassegno di ordine di byte. In tal caso, si consiglia di rimuoverlo prima di scrivere.

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

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top