Tekstbestanden schrijven zonder Byte Order Mark (BOM)?

Ik probeer een tekstbestand te maken met VB.Net met UTF8-codering, zonder stuklijst. Kan iemand mij helpen, hoe dit te doen?

Ik kan een bestand schrijven met UTF8-codering, maar hoe verwijder ik de Byte Order Mark ervan?

bewerk1:
Ik heb dergelijke code geprobeerd;

   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 wordt gemaakt met alleen UTF8-codering en 2.html wordt gemaakt met ANSI-coderingsindeling.

Vereenvoudigde aanpak – http://whatilearnttuday .blogspot.com/2011/10/write-text-files-without-byte-order.html


Antwoord 1, autoriteit 100%

Als u de bytevolgordemarkering (BOM) wilt weglaten, moet uw stream een ​​instantie van UTF8Encodinganders dan System.Text.Encoding.UTF8(die is geconfigureerd om een ​​stuklijst te genereren). Er zijn twee eenvoudige manieren om dit te doen:

1. Expliciet een geschikte codering specificeren:

  1. Bel de UTF8Encodingconstructormet Falsevoor de parameter encoderShouldEmitUTF8Identifier.

  2. Geef de instantie UTF8Encodingdoor aan de streamconstructor.

' 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. De standaardcodering gebruiken:

Als u helemaal geen Encodingaan de constructor van StreamWriteropgeeft, gebruikt StreamWriterstandaard een UTF8-codering zonder stuklijst, dus het volgende zou net zo goed moeten werken:

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

Houd er ten slotte rekening mee dat het weglaten van de stuklijst alleen is toegestaan ​​voor UTF-8, niet voor UTF-16.


Antwoord 2, autoriteit 14%

Probeer dit:

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

Antwoord 3, autoriteit 3%

Gebruik gewoon de methode WriteAllTextvan System.IO.File.

Bekijk het voorbeeld van File.WriteAllText.

Deze methode gebruikt UTF-8-codering zonder een Byte-Order Mark (BOM), dus
met behulp van de GetPreamble-methode wordt een lege byte-array geretourneerd. Als het is
noodzakelijk om een ​​UTF-8-identificatiecode op te nemen, zoals een bytevolgordemarkering, bij
het begin van een bestand, gebruik dan de WriteAllText(String, String,
codering) overbelasting van de methode met UTF8-codering.


Antwoord 4, autoriteit 2%

Interessante opmerking hierover: vreemd genoeg maakt de statische “CreateText()”-methode van de klasse System.IO.File UTF-8-bestanden zonderBOM.

Over het algemeen is dit de bron van bugs, maar in jouw geval had dit de eenvoudigste oplossing kunnen zijn 🙂


Antwoord 5, autoriteit 2%

Als u geen Encodingopgeeft bij het maken van een nieuwe StreamWriterhet standaard Encoding-object dat wordt gebruikt is UTF-8 No BOMdie is gemaakt via new UTF8Encoding(false, true).

Dus om een ​​tekstbestand te maken zonder het BOM-gebruik van de constructors waarvoor u geen codering hoeft op te geven:

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

Antwoord 6

Ik denk dat Roman Nikitin gelijk heeft. De betekenis van het constructorargument wordt omgedraaid. Onwaar betekent geen stuklijst en waar betekent met stuklijst.

Je krijgt een ANSI-codering omdat een bestand zonder stuklijst dat geen niet-ansi-tekens bevat, precies hetzelfde is als een ANSI-bestand. Probeer een paar speciale tekens in je “hallo daar”-tekenreeks en je zult zien dat de ANSI-codering verandert in zonder stuklijst.


Antwoord 7

XML-codering UTF-8 zonder stuklijst
We moeten XML-gegevens indienen bij de EPA en hun toepassing die onze invoer nodig heeft, vereist UTF-8 zonder stuklijst. Oh ja, gewone UTF-8 zou voor iedereen acceptabel moeten zijn, maar niet voor de EPA. Het antwoord om dit te doen staat in de bovenstaande opmerkingen. Bedankt Romeinse Nikitin.

Hier is een C#-fragment van de code voor de XML-codering:

   Encoding utf8noBOM = new UTF8Encoding(false);  
    XmlWriterSettings settings = new XmlWriterSettings();  
    settings.Encoding = utf8noBOM;  
        …  
    using (XmlWriter xw = XmlWriter.Create(filePath, settings))  
    {  
        xDoc.WriteTo(xw);  
        xw.Flush();  
    }    

Om te zien of dit de drie hoofdtekens daadwerkelijk uit het uitvoerbestand verwijdert, kan misleidend zijn. Als u bijvoorbeeld Notepad++(www.notepad-plus-plus.org) gebruikt, wordt “Encode in ANSI” gerapporteerd. Ik denk dat de meeste teksteditors op de stuklijsttekens rekenen om te zien of het UTF-8 is. De manier om dit duidelijk te zien is met een binaire tool zoals WinHex(www.winhex.com). Omdat ik op zoek was naar een voor en na verschil, gebruikte ik de Microsoft WinDiffapplicatie.


Antwoord 8

Voor VB.Net visual basic, dit is hoe het te laten werken:

My.Computer.FileSystem.WriteAllText("FileName", Data, False, System.Text.Encoding.ASCII)

Antwoord 9

Het kan zijn dat uw invoertekst een bytevolgordemarkering bevat. In dat geval moet u het verwijderen voordat u gaat schrijven.


Antwoord 10

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

Geeft u resultaten zoals u wilt (denk ik).

Other episodes