Question

Le bloc de code suivant (extrait pour des raisons de brièveté) génère un doc xml et le crache dans un fichier. Si j'ouvre le fichier dans Visual Studio, il semble être en caractères chinois. Si je l'ouvre dans le Bloc-notes, tout se passe bien Si je suis Console.WriteLine, il a l’air correct.

Je sais que c'est lié à l'encodage, mais je pensais que j'avais tous les canards d'encodage dans une rangée. Que manque-t-il?

StringBuilder stringBuilder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.Unicode;
settings.Indent = true; 
settings.IndentChars = "\t";
using (XmlWriter textWriter = XmlWriter.Create(new StringWriter(stringBuilder), settings))
{
    textWriter.WriteStartElement("Submission");
    textWriter.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
    textWriter.WriteEndElement();
}

using (StreamWriter sw = new StreamWriter(new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)))
            {
                sw.Write(stringBuilder.ToString());
            }
Était-ce utile?

La solution

Le problème est que vous l'écrivez sur disque en utilisant UTF-8, mais il prétendra être en UTF-16 car c'est ce que StringWriter utilise par défaut - et comme vous le configurez explicitement, il utilisera également Encoding.Unicode .

Le moyen le plus simple de résoudre ce problème consiste à utiliser un StringWriter qui se présente comme UTF-8:

public class Utf8StringWriter : StringWriter
{
    public override Encoding
    {
         get { return Encoding.UTF8; }
    }
}

... puis supprimez la ligne settings.Encoding = Encoding.Unicode . De cette façon, vous utiliserez UTF-8 partout. (En fait, la propriété Encoding de XmlWriterSettings est ignorée lorsque vous créez le XmlWriter avec un TextWriter de toute façon.)

Si vous voulez vraiment vouloir UTF-16, lorsque vous créez le StreamWriter , spécifiez également Encoding.Unicode .

Autres conseils

Je ne suis pas sûr de ce que Encoding.Unicode est mais je suppose que c'est UTF-16 qui écrit deux octets par caractère dans le fichier. Pour le texte ASCII normal, l’un des octets est toujours 0.

Essayez plutôt UTF-8 . Cela devrait ressembler à tout éditeur sauf si vous utilisez des caractères spéciaux (avec un point de code > = 128).

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