Ich versuche, eine Textdatei mit VB.Net mit UTF8-Codierung ohne Stückliste zu erstellen. Kann mir jemand helfen, wie das geht?
Ich kann eine Datei mit UTF8-Codierung schreiben, aber wie entferne ich die Byte Order Mark daraus?
edit1: Ich habe Code wie diesen ausprobiert;
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 wird nur mit UTF8-Codierung und 2.html mit ANSI-Codierungsformat erstellt.
Vereinfachter Ansatz - http://whatilearnttuday.blogspot.com/2011/10/write-text-files-without-byte-order.html
vb.net
encoding
file-handling
byte-order-mark
Vijay Balkawade
quelle
quelle
Antworten:
Um das Byte Order Mark (BOM) wegzulassen, muss Ihr Stream eine
UTF8Encoding
andere Instanz alsSystem.Text.Encoding.UTF8
(die zum Generieren einer Stückliste konfiguriert ist) verwenden. Es gibt zwei einfache Möglichkeiten, dies zu tun:1. Explizite Angabe einer geeigneten Codierung:
Rufen Sie den
UTF8Encoding
Konstruktor mitFalse
für denencoderShouldEmitUTF8Identifier
Parameter auf.Übergeben Sie die
UTF8Encoding
Instanz an den Stream-Konstruktor.2. Verwenden Sie die Standardcodierung:
Wenn Sie überhaupt keinen Konstruktor von
Encoding
to angebenStreamWriter
,StreamWriter
wird standardmäßig eine UTF8-Codierung ohne Stückliste verwendet. Daher sollte Folgendes genauso gut funktionieren:Beachten Sie schließlich, dass das Weglassen der Stückliste nur für UTF-8 und nicht für UTF-16 zulässig ist.
quelle
My.Computer.FileSystem.WriteAllText
Schreibt beispielsweise die Stückliste, wenn keine Codierung angegeben ist.My.Computer.FileSystem.WriteAllText
ist diesbezüglich eine Ausnahme, die möglicherweise auf Abwärts-VB-Kompatibilität hindeutet?File.WriteAllText
Der Standardwert ist UFT8NoBOM.Versuche dies:
quelle
Verwenden Sie einfach die Methode
WriteAllText
vonSystem.IO.File
.Bitte überprüfen Sie das Beispiel aus File.WriteAllText .
quelle
Interessanter Hinweis dazu: Seltsamerweise erstellt die statische Methode "CreateText ()" der System.IO.File-Klasse UTF-8-Dateien ohne Stückliste.
Im Allgemeinen ist dies die Quelle von Fehlern, aber in Ihrem Fall könnte es die einfachste Problemumgehung gewesen sein :)
quelle
Wenn Sie
Encoding
beim Erstellen eines neuen Objekts kein angeben , wirdStreamWriter
standardmäßig dasEncoding
Objekt verwendet, überUTF-8 No BOM
das erstellt wirdnew UTF8Encoding(false, true)
.So erstellen Sie eine Textdatei ohne Stücklistenverwendung der Konstruktoren, für die Sie keine Codierung angeben müssen:
quelle
leaveOpen
?StreamWriter
verwenden. Sie müssen angeben,new UTF8Encoding(false, true)
damit Ihre CodierungleaveOpen
die Stückliste angeben kann und nicht.Ich denke, Roman Nikitin hat recht. Die Bedeutung des Konstruktorarguments wird umgedreht. Falsch bedeutet keine Stückliste und wahr bedeutet mit Stückliste.
Sie erhalten eine ANSI-Codierung, da eine Datei ohne Stückliste, die keine Nicht-Ansi-Zeichen enthält, genau mit einer ANSI-Datei identisch ist. Probieren Sie einige Sonderzeichen in Ihrer "Hallo" -String aus, und Sie werden sehen, wie sich die ANSI-Codierung in "Ohne Stückliste" ändert.
quelle
XML-Codierung UTF-8 ohne Stückliste
Wir müssen XML-Daten an die EPA senden, und für ihre Anwendung, die unsere Eingaben übernimmt, ist UTF-8 ohne Stückliste erforderlich. Oh ja, einfaches UTF-8 sollte für alle akzeptabel sein, aber nicht für die EPA. Die Antwort darauf finden Sie in den obigen Kommentaren. Vielen Dank, dass Sie Roman Nikitin .
Hier ist ein C # -Schnipsel des Codes für die XML-Codierung:
Es kann irreführend sein, zu sehen, ob dadurch tatsächlich die drei führenden Zeichen aus der Ausgabedatei entfernt werden. Wenn Sie beispielsweise Notepad ++ (www.notepad-plus-plus.org) verwenden, wird "In ANSI verschlüsseln" gemeldet. Ich denke, die meisten Texteditoren zählen auf die Stücklistenzeichen, um festzustellen, ob es sich um UTF-8 handelt. Dies lässt sich mit einem Binärwerkzeug wie WinHex (www.winhex.com) klar erkennen . Da ich nach einem Vorher- Nachher- Unterschied gesucht habe, habe ich die Microsoft WinDiff- Anwendung verwendet.
quelle
Möglicherweise enthält Ihr Eingabetext eine Bytereihenfolge. In diesem Fall sollten Sie es vor dem Schreiben entfernen.
quelle
Gibt Ihnen Ergebnisse als die, die Sie wollen (ich denke).
quelle