J'essaie de créer un fichier texte en utilisant VB.Net avec encodage UTF8, sans BOM. Quelqu'un peut-il m'aider, comment faire cela?
Je peux écrire un fichier avec un encodage UTF8 mais, comment en supprimer Byte Order Mark?
edit1: j'ai essayé un code comme celui-ci;
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 est créé avec le codage UTF8 uniquement et 2.html est créé avec le format de codage ANSI.
Approche simplifiée - http://whatilearnttuday.blogspot.com/2011/10/write-text-files-without-byte-order.html
vb.net
encoding
file-handling
byte-order-mark
Vijay Balkawade
la source
la source
Réponses:
Afin d'omettre la marque d'ordre d'octet (BOM), votre flux doit utiliser une instance de
UTF8Encoding
autre queSystem.Text.Encoding.UTF8
(qui est configurée pour générer une nomenclature). Il existe deux façons simples de procéder:1. Spécification explicite d'un codage approprié:
Appelez le
UTF8Encoding
constructeur avecFalse
pour leencoderShouldEmitUTF8Identifier
paramètre.Passez l'
UTF8Encoding
instance au constructeur de flux.2. En utilisant le codage par défaut:
Si vous ne fournissez pas du tout un constructeur de
Encoding
toStreamWriter
,StreamWriter
utilisera par défaut un encodage UTF8 sans BOM, donc ce qui suit devrait fonctionner aussi bien:Enfin, notez que l'omission de la nomenclature n'est autorisée que pour UTF-8, pas pour UTF-16.
la source
My.Computer.FileSystem.WriteAllText
écrit la nomenclature si aucun codage n'est spécifié.My.Computer.FileSystem.WriteAllText
est une exception à cet égard, devinant peut-être la compatibilité VB vers l'arrière?File.WriteAllText
par défaut, UFT8NoBOM.Essaye ça:
la source
Utilisez simplement la méthode
WriteAllText
deSystem.IO.File
.Veuillez vérifier l'exemple de File.WriteAllText .
la source
Note intéressante à ce sujet: étrangement, la méthode statique "CreateText ()" de la classe System.IO.File crée des fichiers UTF-8 sans BOM.
En général, c'est la source de bogues, mais dans votre cas, cela aurait pu être la solution de contournement la plus simple :)
la source
Si vous ne spécifiez pas de
Encoding
lors de la création d'un nouvel objet, l'objetStreamWriter
par défautEncoding
utilisé est celuiUTF-8 No BOM
qui est créé vianew UTF8Encoding(false, true)
.Donc, pour créer un fichier texte sans la nomenclature, utilisez des constructeurs qui ne vous obligent pas à fournir un encodage:
la source
leaveOpen
?StreamWriter
utilise. Vous devrez spécifiernew UTF8Encoding(false, true)
votre encodage pour pouvoir spécifierleaveOpen
et ne pas avoir la nomenclature.Je pense que Roman Nikitin a raison. La signification de l'argument constructeur est inversée. Faux signifie pas de nomenclature et vrai signifie avec nomenclature.
Vous obtenez un codage ANSI car un fichier sans nomenclature qui ne contient pas de caractères non ansi est exactement le même qu'un fichier ANSI. Essayez quelques caractères spéciaux dans votre chaîne "hi there" et vous verrez le codage ANSI passer à sans BOM.
la source
Codage XML UTF-8 sans BOM
Nous devons soumettre des données XML à l'EPA et leur application qui prend notre entrée nécessite UTF-8 sans BOM. Oh oui, l'UTF-8 devrait être acceptable pour tout le monde, mais pas pour l'EPA. La réponse à cela se trouve dans les commentaires ci-dessus. Merci Roman Nikitin .
Voici un extrait C # du code pour l'encodage XML:
Voir si cela supprime réellement les trois premiers caractères du fichier de sortie peut être trompeur. Par exemple, si vous utilisez Notepad ++ (www.notepad-plus-plus.org), il indiquera «Encode in ANSI». Je suppose que la plupart des éditeurs de texte comptent sur les caractères de la nomenclature pour dire s'il s'agit de UTF-8. La manière de voir clairement ceci est avec un outil binaire comme WinHex (www.winhex.com). Comme je cherchais une différence avant et après, j'ai utilisé l' application Microsoft WinDiff .
la source
Il se peut que votre texte d'entrée contienne une marque d'ordre d'octet. Dans ce cas, vous devez le supprimer avant d'écrire.
la source
Vous donne des résultats comme ceux que vous voulez (je pense).
la source