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 UTF8Encoding
anders 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:
-
Bel de
UTF8Encoding
constructormetFalse
voor de parameterencoderShouldEmitUTF8Identifier
. -
Geef de instantie
UTF8Encoding
door 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 Encoding
aan de constructor van StreamWriter
opgeeft, gebruikt StreamWriter
standaard 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 WriteAllText
van 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 Encoding
opgeeft bij het maken van een nieuwe StreamWriter
het standaard Encoding
-object dat wordt gebruikt is UTF-8 No BOM
die 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).