J'essaie de créer un fichier texte en utilisant VB.Net avec le codage UTF8, sans nomenclature. Quelqu'un peut-il m'aider, comment faire cela?
Je peux écrire un fichier avec le codage UTF8 mais comment supprimer Byte Order Mark?
edit1: J'ai essayé le code comme ça;
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 avec le format de codage ANSI.
Approche simplifiée - http://whatilearnttuday.blogspot.com/2011/10/write-text-files-without-byte-order.html
Afin d'omettre la marque d'ordre d'octet (BOM), votre flux doit utiliser une instance de UTF8Encoding
autre que System.Text.Encoding.UTF8
(configuré pour générer une nomenclature). Il existe deux manières simples de procéder:
1. Spécifier explicitement un encodage approprié:
Appelez le UTF8Encoding
constructeur avec False
pour le encoderShouldEmitUTF8Identifier
paramètre.
Passe le UTF8Encoding
instance du constructeur de flux.
' 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. Utilisation du codage par défaut:
Si vous ne fournissez pas du tout le constructeur de Encoding
à StreamWriter
, StreamWriter
utilisera par défaut un encodage UTF8 sans nomenclature.
' VB.NET:
Using sink As New StreamWriter("Foobar.txt")
sink.WriteLine("...")
End Using
// C#:
using (var sink = new StreamWriter("Foobar.txt"))
{
sink.WriteLine("...");
}
Enfin, notez que l’omission de la nomenclature n’est autorisée que pour UTF-8, pas pour UTF-16.
Essaye ça:
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
Il suffit simplement d’utiliser la méthode WriteAllText
de System.IO.File
.
Veuillez vérifier l'échantillon de File.WriteAllText .
Cette méthode utilise le codage UTF-8 sans marque d'octet (Byte-Order Mark). L'utilisation de la méthode GetPreamble renvoie donc un tableau d'octets vide. S'il est nécessaire d'inclure un identifiant UTF-8, tel qu'une marque d'ordre d'octet, au début d'un fichier, utilisez la surcharge de méthode WriteAllText (String, String, Encoding) avec le codage UTF8.
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 des bogues, mais dans votre cas, cela aurait pu être la solution de contournement la plus simple :)
Si vous ne spécifiez pas de Encoding
lors de la création d'un nouvel objet StreamWriter
, l'objet par défaut Encoding
utilisé est UTF-8 No BOM
qui est créé via new UTF8Encoding(false, true)
.
Donc, pour créer un fichier texte sans utiliser la nomenclature des constructeurs qui ne vous obligent pas à fournir un codage:
new StreamWriter(Stream)
new StreamWriter(String)
new StreamWriter(String, Boolean)
Je pense que Roman Nikitin a raison. La signification de l'argument constructeur est inversée. False signifie pas de nomenclature et true signifie avec nomenclature.
Vous obtenez un codage ANSI car un fichier sans nomenclature ne contenant pas de caractères non-ansi est exactement identique à un fichier ANSI. Essayez quelques caractères spéciaux dans votre chaîne "hi there" et vous verrez le codage ANSI passer à sans-BOM.
Codage XML UTF-8 sans nomenclature
Nous devons soumettre des données XML à l'EPA et leur application nécessitant notre entrée nécessite UTF-8 sans nomenclature. Oh oui, le format UTF-8 devrait être acceptable pour tout le monde, mais pas pour l'EPA. La réponse à cette question se trouve dans les commentaires ci-dessus. Merci Roman Nikitin.
Voici un extrait C # du code pour le codage XML:
Encoding utf8noBOM = new UTF8Encoding(false);
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = utf8noBOM;
…
using (XmlWriter xw = XmlWriter.Create(filePath, settings))
{
xDoc.WriteTo(xw);
xw.Flush();
}
Pour voir si cela supprime réellement les trois caractères principaux du fichier de sortie peut être trompeur. Par exemple, si vous utilisez Notepad ++ (www.notepad-plus-plus.org), le message "Encoder in ANSI" sera indiqué. Je suppose que la plupart des éditeurs de texte comptent sur les caractères de la nomenclature pour indiquer s'il s'agit du format UTF-8. La façon de voir clairement ceci est avec un outil binaire tel que WinHex (www.winhex.com). Comme je cherchais une différence avant et après, j’utilisais l’application Microsoft WinDiff.