Question

Je suis en train de créer un fichier texte en utilisant VB.Net avec UTF8, sans nomenclature. Quelqu'un peut-il me aider, comment faire?
Je peux écrire fichier UTF8 mais, comment supprimer Byte Order Mark de lui?

edit1: J'ai essayé code comme ceci;

    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 get créé avec UTF8 encodage seulement et 2.html obtenir créé avec le format de codage ANSI.

Approche simplifiée - http: // whatilearnttuday .blogspot.com / 2011/10 / écriture-texte-fichiers sans-octet order.html

Était-ce utile?

La solution

Afin d'omettre la marque d'ordre d'octet (BOM), votre flux doit utiliser une instance de UTF8Encoding autre que System.Text.Encoding.UTF8 (qui est configuré pour générer un BOM). Il y a deux façons simples de le faire:

1. spécifiant explicitement un codage approprié:

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

  2. Passez l'instance UTF8Encoding au 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. En utilisant l'encodage par défaut:

Si vous ne fournissez pas un Encoding au constructeur de StreamWriter du tout, StreamWriter utilisera par défaut un codage UTF8 sans BOM, donc ce qui suit devrait fonctionner tout aussi bien:

' 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 est autorisé uniquement pour le UTF-8, et non pour UTF-16.

Autres conseils

Essayez ceci:

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 d'utiliser simplement la méthode WriteAllText de System.IO.File.

S'il vous plaît vérifier l'échantillon File.WriteAllText .

  

Cette méthode utilise encodage UTF-8 sans ordre d'octet Mark (BOM), donc   en utilisant la méthode GetPreamble retourne un tableau d'octets vides. Si c'est   nécessaire d'inclure un identificateur UTF-8, comme une marque d'ordre d'octets à   le début d'un fichier, utilisez le WriteAllText (String, String,   Encoding) avec une surcharge de la méthode de codage UTF8.

Note intéressante par rapport à ceci:. Étrangement, la méthode statique "CreateText ()" de la classe System.IO.File crée des fichiers UTF-8 sans BOM

En général, cette source de bugs, mais dans votre cas, il aurait pu être la plus simple solution de contournement:)

Si vous ne spécifiez pas Encoding lors de la création d'un nouveau StreamWriter l'objet Encoding par défaut utilisé est UTF-8 No BOM qui est créé par l'intermédiaire d'new UTF8Encoding(false, true).

Donc, pour créer un fichier texte sans l'utilisation de la nomenclature des des constructeurs qui ne vous obligent pas à fournir un encodage:

new StreamWriter(Stream)
new StreamWriter(String)
new StreamWriter(String, Boolean)

Je pense que Roman Nikitin est juste. Le sens de l'argument du constructeur est basculée. des moyens faux pas de nomenclature et vrai moyen avec la nomenclature.

Vous obtenez un codage ANSI car un fichier sans une nomenclature qui ne contient pas de caractères non-ansi est exactement identique à un fichier ANSI. Essayez quelques caractères spéciaux en vous « salut » Chaîne et vous verrez le changement d'encodage ANSI sans-BOM.

encodage XML UTF-8 sans BOM Nous devons soumettre des données XML à l'APE et leur application qui prend notre entrée nécessite UTF-8 sans BOM. Oh oui, plaine UTF-8 devrait être acceptable pour tout le monde, mais pas pour l'EPA. La réponse à faire est dans les commentaires ci-dessus. Merci Roman Nikitin .

Voici un extrait de 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 effectivement les trois caractères principaux à partir du fichier de sortie peut induire en erreur. Par exemple, si vous utilisez Notepad ++ (www.notepad-plus-plus.org), il rapportera « Encode ANSI ». Je suppose que la plupart des éditeurs de texte comptent sur les caractères de nomenclature pour dire si elle est UTF-8. La façon de voir clairement c'est un outil binaire comme WinHex (www.winhex.com). Depuis que je cherchais un avant et après différence je la Microsoft WinDiff application.

Il est peut-être que votre texte d'entrée contient une marque d'ordre d'octets. Dans ce cas, vous devez l'enlever avant d'écrire.

Dim sWriter As IO.StreamWriter = New IO.StreamWriter(shareworklist & "\" & getfilename() & ".txt", False, Encoding.Default)

vous donne les résultats que ceux que vous voulez (je pense).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top