Question

Je ne parviens pas à écrire des caractères norvégiens dans un fichier XML à l'aide de C #. J'ai une variable chaîne contenant du texte norvégien (avec des lettres comme æøå).

J'écris le code XML à l'aide d'un XmlTextWriter, en écrivant le contenu dans un MemoryStream comme ceci:

MemoryStream stream = new MemoryStream();
XmlTextWriter xmlTextWriter = new XmlTextWriter(stream, Encoding.GetEncoding("ISO-8859-1"));
xmlTextWriter.Formatting = Formatting.Indented;
xmlTextWriter.WriteStartDocument(); //Start doc

Ensuite, j'ajoute mon texte norvégien comme ceci:

xmlTextWriter.WriteCData(myNorwegianText);

Ensuite, j'écris le fichier sur le disque comme suit:

FileStream myFile = new FileStream(myPath, FileMode.Create);
StreamWriter sw = new StreamWriter(myFile);

stream.Position = 0;
StreamReader sr = new StreamReader(stream);
string content = sr.ReadToEnd();

sw.Write(content);
sw.Flush();

myFile.Flush();
myFile.Close();

Le problème, c’est que dans le fichier, tous les caractères norvégiens ont l’air drôle.

Je fais probablement ce qui précède d'une manière stupide. Des suggestions sur la façon de résoudre ce problème?

Était-ce utile?

La solution

Pourquoi écrivez-vous d'abord le XML dans un MemoryStream, puis dans le flux de fichiers réel? C'est assez inefficace. Si vous écrivez directement dans FileStream, cela devrait fonctionner.

Si vous voulez toujours faire la double écriture, pour une raison quelconque, effectuez l'une des deux choses suivantes. Soit

  1. Assurez-vous que les objets StreamReader et StreamWriter que vous utilisez tous utilisent le même même codage que celui que vous avez utilisé avec XmlWriter (pas seulement StreamWriter). quelqu'un d'autre a suggéré), ou

  2. N'utilisez pas StreamReader / StreamWriter. Au lieu de cela, copiez simplement le flux au niveau octet en utilisant un octet simple [] et Stream.Read/Write. Cela va être, d'ailleurs, beaucoup plus efficace de toute façon.

Autres conseils

Votre StreamWriter et votre StreamReader utilisent UTF-8, car vous ne spécifiez pas l'encodage. C'est pourquoi les choses se corrompent.

Comme tomasr l’a dit, utiliser un FileStream pour commencer serait plus simple, mais MemoryStream a aussi le style pratique "WriteTo". méthode qui vous permet de le copier très facilement dans un FileStream.

En passant, j'espère que vous avez une déclaration using dans votre vrai code. Vous ne voulez pas laisser votre descripteur de fichier ouvert si quelque chose ne va pas pendant que vous écrivez.

Jon

Vous devez définir le codage à chaque fois que vous écrivez une chaîne ou lisez des données binaires sous forme de chaîne.

    Encoding encoding = Encoding.GetEncoding("ISO-8859-1");

    FileStream myFile = new FileStream(myPath, FileMode.Create);
    StreamWriter sw = new StreamWriter(myFile, encoding);

    stream.Position = 0;
    StreamReader sr = new StreamReader(stream, encoding);
    string content = sr.ReadToEnd();

    sw.Write(content);
    sw.Flush();

    myFile.Flush();
    myFile.Close();

Comme mentionné dans les réponses ci-dessus, le plus gros problème ici est le Encodage , qui est configuré par défaut car non spécifié.

Lorsque vous ne spécifiez pas de code Encodage pour ce type de conversion, la valeur par défaut de UTF-8 est utilisée, ce qui peut correspondre ou non à votre scénario. Vous convertissez également les données inutilement en les poussant dans un MemoryStream , puis en un FileStream .

Si vos données d'origine ne sont pas UTF-8 , il se passera ici que la première transition dans le MemoryStream tentera de décoder à l'aide du code par défaut sur UTF-8 - et altérera vos données. Lorsque vous écrivez ensuite dans FileStream , qui utilise également UTF-8 comme codage par défaut, vous persistez simplement cette corruption dans le fichier.

Pour résoudre ce problème, vous devez probablement spécifier Encodage dans vos objets Stream .

Vous pouvez en fait ignorer entièrement le processus MemoryStream , qui sera également plus rapide et plus efficace. Votre code mis à jour pourrait ressembler davantage à ceci:

FileStream fs = new FileStream(myPath, FileMode.Create);

XmlTextWriter xmlTextWriter = 
    new XmlTextWriter(fs, Encoding.GetEncoding("ISO-8859-1"));

xmlTextWriter.Formatting = Formatting.Indented;
xmlTextWriter.WriteStartDocument(); //Start doc

xmlTextWriter.WriteCData(myNorwegianText);

StreamWriter sw = new StreamWriter(fs);

fs.Position = 0;
StreamReader sr = new StreamReader(fs);
string content = sr.ReadToEnd();

sw.Write(content);
sw.Flush();

fs.Flush();
fs.Close();

Quel encodage utilisez-vous pour afficher le fichier de résultat? S'il ne se trouve pas dans ISO-8859-1, il ne s'affichera pas correctement.

Existe-t-il une raison d'utiliser ce codage spécifique au lieu de, par exemple, UTF8?

Après avoir enquêté, voici ce qui a fonctionné le mieux pour moi:

var doc = new XDocument(new XDeclaration("1.0", "ISO-8859-1", ""));
        using (XmlWriter writer = doc.CreateWriter()){
            writer.WriteStartDocument();
            writer.WriteStartElement("Root");
            writer.WriteElementString("Foo", "value");
            writer.WriteEndElement();
            writer.WriteEndDocument();
        }
        doc.Save("dte.xml");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top