Écrire des fichiers texte sans Marque d'Ordre des Octets (BOM)?
Je suis en train de créer un fichier texte à l'aide VB.Net avec l'encodage UTF8 sans BOM. Quelqu'un peut-il m'aider, comment faire?
Je peux écrire le fichier avec l'encodage UTF8 mais, comment faire pour supprimer Marque d'Ordre des Octets à partir d'elle?
edit1:
J'ai essayé ce code;
Dim utf8 As New UTF8Encoding()
Dim utf8EmitBOM As New UTF8Encoding(True)
Dim strW As New StreamWriter("c:\temp\bom.html", True, utf8EmitBOM)
strW.Write(utf8EmitBOM.GetPreamble())
strW.WriteLine("hi there")
strW.Close()
Dim strw2 As New StreamWriter("c:\temp\bom.html", True, utf8)
strw2.Write(utf8.GetPreamble())
strw2.WriteLine("hi there")
strw2.Close()
1.html créé avec l'encodage UTF8 seulement et 2.html créé avec l'encodage ANSI format.
Approche simplifiée - http://whatilearnttuday.blogspot.com/2011/10/write-text-files-without-byte-order.html
- Si vous ne voulez pas une NOMENCLATURE, pourquoi écrivez-vous GetPreamble()?
Vous devez vous connecter pour publier un commentaire.
Afin d'omettre la marque d'ordre des octets (BOM), le flux doit utiliser une instance de
UTF8Encoding
autres queSystem.Texte.L'encodage.UTF8
(qui est configuré pour générer une NOMENCLATURE). Il y a deux façons de le faire:1. Spécifiant explicitement un adapté d'encodage:
Appeler le
UTF8Encoding
constructeur avecFalse
pour laencoderShouldEmitUTF8Identifier
paramètre.Passer le
UTF8Encoding
instance de flux de constructeur.2. En utilisant le codage par défaut:
Si vous ne fournissez pas un
Encoding
àStreamWriter
s'constructeur à tous,StreamWriter
par défaut, utilisez un encodage UTF8 sans BOM, donc la suivante devrait fonctionner tout aussi bien:Enfin, notez que l'omission de la NOMENCLATURE n'est autorisé que pour l'UTF-8, pas pour de l'UTF-16.
My.Computer.FileSystem.WriteAllText
écrit la NOMENCLATURE, si l'encodage n'est pas spécifié.My.Computer.FileSystem.WriteAllText
est une exception à cet égard, de deviner en arrière, VB compatibilité peut-être?File.WriteAllText
par défaut UFT8NoBOM.Essayez ceci:
Tout Simplement utiliser la méthode
WriteAllText
deSystem.IO.File
.Veuillez vérifier l'échantillon de Fichier.WriteAllText.
Est intéressant de noter à l'égard de ce: étrangement, le statique "CreateText()" méthode du Système.IO.Fichier de classe crée les fichiers UTF-8 sans NOMENCLATURE.
En général ce la source de bugs, mais dans votre cas, il pourrait avoir été la solution la plus simple 🙂
Si vous ne spécifiez pas un
Encoding
lors de la création d'un nouveauStreamWriter
la valeur par défautEncoding
objet utilisé estUTF-8 Sans BOM
qui est créé vianew UTF8Encoding(false, true)
.Afin de créer un fichier texte sans la NOMENCLATURE utilisation des constructeurs qui ne nécessitent pas de vous fournir un codage:
leaveOpen
?StreamWriter
utilise. Vous aurez besoin de spécifiernew UTF8Encoding(false, true)
pour votre codage pour être en mesure de préciserleaveOpen
et ne pas avoir la NOMENCLATURE.Je pense que Romain Nikitin est le droit. Le sens de l'argument du constructeur est retourné. False signifie pas la NOMENCLATURE et le vrai moyen avec BOM.
Vous obtenez un codage ANSI à cause d'un fichier sans BOM qui ne contiennent pas de caractères non-ansi est exactement le même comme un fichier ANSI. Essayez certains caractères spéciaux en vous "salut à tous" de la chaîne et vous verrez le codage ANSI changement de sans-BOM.
XML Encoding UTF-8 sans BOM
Nous avons besoin de soumettre des données XML à l'EPA et de leur application qui ne prend que notre entrée exige UTF-8 sans BOM. Oh oui, de la plaine de l'UTF-8 doit être acceptable pour tout le monde, mais pas pour l'APE. La réponse est dans les commentaires ci-dessus. Merci Romain Nikitin.
Ici C# extrait du code de l'encodage XML:
Pour voir si cela élimine les trois premiers caractères du fichier de sortie peut être trompeuse. Par exemple, si vous utilisez Notepad++ (www.notepad-plus-plus.org), il signale “Encoder en ANSI”. Je suppose que la plupart des éditeurs de texte sont en comptant sur la NOMENCLATURE des caractères pour dire si c'est de l'UTF-8. La façon de voir clairement, c'est avec une binaire outil comme WinHex (www.winhex.com). Depuis que je suis à la recherche d'un avant et d'après la différence que j'ai utilisé Microsoft WinDiff application.
Il se pourrait que votre saisie de texte contient une marque d'ordre d'octet. Dans ce cas, vous devez le supprimer avant d'écrire.
Vous donne des résultats comme ceux que vous voulez(je pense).