web-dev-qa-db-fra.com

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

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

114
Vijay Balkawade

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é:

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

  2. 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.

195
stakx

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
28
Roman Nikitin

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.

6
Joe.wang

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 :)

4
Tao

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)
4
JG in SD

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.

3
jos

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.

1
Jerry Banasik