120 votes

Écrire des fichiers texte sans Byte Order Mark (BOM) ?

J'essaie de créer un fichier texte en utilisant VB.Net avec un encodage UTF8, sans BOM. Quelqu'un peut-il m'aider à le faire ?
Je peux écrire un fichier avec l'encodage UTF8 mais, comment supprimer la marque d'ordre des octets ?
Merci d'avance. 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 un encodage UTF8 uniquement et 2.html est créé avec un encodage ANSI.

Approche simplifiée - http://whatilearnttuday.blogspot.com/2011/10/write-text-files-without-byte-order.html

209voto

stakx Points 29832

Afin d'omettre le byte order mark (BOM), votre flux doit utiliser une instance personnalisée de UTF8Encoding au lieu de l'option par défaut System.Text.Encoding.UTF8 :

  1. Appelez le UTF8Encoding Constructeur avec False pour le encoderShouldEmitUTF8Identifier paramètre.

  2. Passez le UTF8Encoding au constructeur du flux.

Exemple (VB.NET) :

Dim utf8WithoutBom As New System.Text.UTF8Encoding(False)
                                                  '^^^^^'
Using sink As New StreamWriter("Foobar.txt", False, utf8WithoutBom)
    sink.WriteLine("...")
End Using

Exemple (C#) :

var utf8WithoutBom = new System.Text.UTF8Encoding(false);
                                                //^^^^^
using (var sink = new StreamWriter("Foobar.txt", false, utf8WithoutBom))
{
    sink.WriteLine("...");
}

Notez que l'omission de la nomenclature n'est autorisée que pour UTF-8, pas pour UTF-16.

29voto

Roman Nikitin Points 181

Essayez ç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

4voto

Tao Points 5475

Remarque intéressante à ce sujet : bizarrement, la méthode statique "CreateText()" de la classe System.IO.File crée des fichiers UTF-8 sans NOMENCLATURE.

En général, c'est la source de bugs, mais dans votre cas, cela aurait pu être la solution la plus simple :)

3voto

jos Points 1

Je pense que Roman Nikitin a raison. La signification de l'argument du constructeur est inversée. Faux signifie sans nomenclature et vrai signifie avec nomenclature.

Vous obtenez un encodage ANSI parce qu'un fichier sans BOM qui ne contient pas de caractères non ANSI est exactement le même qu'un fichier ANSI. Essayez d'insérer des caractères spéciaux dans votre chaîne "hi there" et vous verrez que l'encodage ANSI devient without-BOM.

-1voto

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X