Ecriture de fichiers XML en utilisant XmlTextWriter avec encodage ISO-8859-1
Je vais avoir un problème d'écriture norvégien de caractères dans un fichier XML à l'aide de C#. J'ai une variable de type string contenant certains norvégien texte (avec des lettres comme æøå).
Je suis en train d'écrire le code XML à l'aide d'un XmlTextWriter, écrit le contenu d'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
Puis-je ajouter mon norvégien texte comme ceci:
xmlTextWriter.WriteCData(myNorwegianText);
Puis-je écrire le fichier sur le disque comme ceci:
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();
Maintenant, le problème est que dans le fichier sur ce, tout le norvégien caractères de l'air bizarre.
Je suis sans doute la-dessus, dans certains stupide. Toutes les suggestions sur la façon de résoudre ce problème?
source d'informationauteur henningst
Vous devez vous connecter pour publier un commentaire.
Pourquoi écrivez-vous le XML d'abord à un MemoryStream et puis l'écriture que de la réelle fichier de flux? C'est assez inefficace. Si vous écrivez directement à l'FileStream il devrait fonctionner.
Si vous voulez continuer à faire de la double écriture, pour quelque raison que ce soit, faire une de deux choses. Soit
Assurez-vous que le StreamReader et StreamWriter les objets que vous utilisez tous utiliser le même encodage que celui que vous avez utilisé avec de l'XmlWriter (et pas seulement le StreamWriter, comme quelqu'un d'autre a suggéré), ou
Ne pas utiliser StreamReader/StreamWriter. Au lieu de cela il suffit de copier le flux au niveau de l'octet à l'aide d'un simple byte[] et de Flux.Lecture/Écriture. Ce sera, d'ailleurs, beaucoup plus efficace de toute façon.
À la fois votre StreamWriter et votre StreamReader sont en UTF-8, car vous n'êtes pas en spécifiant l'encodage. C'est pourquoi les choses sont d'obtenir endommagé.
Comme tomasr dit, à l'aide d'un FileStream pour commencer serait plus simple - mais aussi MemoryStream a la pratique "WriteTo" méthode qui vous permet de le copier à un FileStream très facilement.
J'espère que vous avez reçu une instruction d'utilisation de votre code réel, en passant, vous ne voulez pas laisser votre descripteur de fichier ouvert si quelque chose va mal, alors que vous êtes en train de rédiger.
Jon
Vous avez besoin pour définir l'encodage chaque fois que vous écrivez une chaîne ou lire des données binaires comme une chaîne de caractères.
Comme mentionné dans les réponses ci-dessus, la question la plus importante ici est la
Encoding
qui est par défaut en raison de la non spécifié.Lorsque vous ne spécifiez pas un
Encoding
pour ce genre de conversion, la valeur par défaut deUTF-8
est utilisée - ce qui peut ou peut ne pas correspondre à votre scénario. Vous êtes également à convertir les données inutilement en l'enfonçant dans unMemoryStream
puis dans unFileStream
.Si vos données d'origine n'est pas
UTF-8
ce qui va se passer ici, c'est que la première transition dans leMemoryStream
va tenter de décoder en utilisant par défautEncoding
deUTF-8
- et corrompre vos données. Lorsque vous puis écrire sur leFileStream
qui est aussi à l'aide deUTF-8
que l'encodage par défaut, il vous suffit de persister que la corruption dans le fichier.Dans le but de résoudre le problème, vous avez probablement besoin de spécifier
Encoding
dans votreStream
objets.Vous pouvez réellement sauter le
MemoryStream
entièrement le processus, aussi - ce qui sera plus rapide et plus efficace. Mise à jour de votre code pourrait ressembler à quelque chose de plus comme:Dont l'encodage que vous utilisez pour afficher le fichier de résultat? Si elle n'est pas en ISO-8859-1, il ne s'affichera pas correctement.
Est-il une raison pour utiliser ce codage spécifique, au lieu de, par exemple, UTF8?
Après enquête, c'est qui qui a le mieux fonctionné pour moi: