Text in UTF-8 speichern
BlaBlub
- programmiertechnik
Hallo,
System.IO.Stream fileStream;
System.IO.MemoryStream userInput = new System.IO.MemoryStream();
XmlDocument doc = new XmlDocument();
XmlNode myRoot, myNode;
myRoot = doc.CreateElement("test");
doc.AppendChild(myRoot);
for (int i = 0; i <= a; i++)
{
myNode = myRoot.AppendChild(doc.CreateElement("node"));
myRoot.SelectNodes("node").Item(i).Attributes.Append(doc.CreateAttribute("param")).InnerText = i.ToString();
}
doc.Save(userInput);
fileStream = saveFileDialog1.OpenFile();
userInput.Position = 0;
userInput.WriteTo(fileStream);
ich generiere ein XML-Dokument und speichere es. Es wird aber ANSI-codiert gespeichert. Wenn ich es dann manuell mit Notepad öffne und UTF-8 codiert abspeichere, kann ich es in meinem weiterem Programmcode nutzen.
Wie bekomme ich es hin, dass er gleich als UTF-8 speichert?
Gruß
BlaBlub
Hi!
Wie bekomme ich es hin, dass er gleich als UTF-8 speichert?
Macht "er" doch. Du hast keinerlei Nicht-ASCII-Zeichen in deinem Beispiel. Die Ausgabe stellt somit mindestens gültiges ISO-8859-0..15, Windows-1252 und UTF-8 dar. Aber selbst wenn ich mal i.ToString() durch ein "ä" ersetze, erhalte ich UTF-8-kodierte ä in der Datei.
P.S. Dass es sich um C# handelt, hättest du ruhig dazuschreiben könne. Ebenso andere Begleitumstände (wie die Versionsnummer des .NET-Frameworks) und woraus du entnimmst, dass kein UTF-8 ausgegeben würde.
Lo!
Hi!
Wie bekomme ich es hin, dass er gleich als UTF-8 speichert?
Macht "er" doch. Du hast keinerlei Nicht-ASCII-Zeichen in deinem Beispiel. Die Ausgabe stellt somit mindestens gültiges ISO-8859-0..15, Windows-1252 und UTF-8 dar. Aber selbst wenn ich mal i.ToString() durch ein "ä" ersetze, erhalte ich UTF-8-kodierte ä in der Datei.
P.S. Dass es sich um C# handelt, hättest du ruhig dazuschreiben könne. Ebenso andere Begleitumstände (wie die Versionsnummer des .NET-Frameworks) und woraus du entnimmst, dass kein UTF-8 ausgegeben würde.
Lo!
Hallo,
sry für die vergessene Beschreibung. Mache gerade mehrere Sachen parallel.
Benutze .Net Framework 2.0 und ja, es ist c# :-)
Wenn ich in der abgespeicherten XML-Datei ein Umlaut habe und Sie im weiteren Programmverlauf validiere, gibt er mir einen Fehler aus.
Wenn ich die XML-Datei im Windows Editor öffne und "Speichern unter.." wähle, hat er "ANSI" als Codierung gewählt. Wenn ich da nun "UTF-8" wähle und abspeichere, wird mir der Umlautfehler im weiteren Programmablauf nicht mehr angezeigt.
Hi!
Wenn ich in der abgespeicherten XML-Datei ein Umlaut habe und Sie im weiteren Programmverlauf validiere, gibt er mir einen Fehler aus.
Normalerweise wird XML in UTF-8 gespeichert. Explizit angeben kannst du die Kodierung, wenn du den MemoryStream weglässt und stattdessen einen XmlTextWriter verwendest.
Wenn ich die XML-Datei im Windows Editor öffne und "Speichern unter.." wähle, hat er "ANSI" als Codierung gewählt. Wenn ich da nun "UTF-8" wähle und abspeichere, wird mir der Umlautfehler im weiteren Programmablauf nicht mehr angezeigt.
Der Windows-Editor ist kein besonders gutes Debug-Werkzeug. Besser wäre ein Hexeditor, beispielsweise der Notepad++ mit dem HexEditor-Plugin.
P.S. Bitte nicht einfach alles zitieren sondern nur den Teil, auf den du dich beziehst.
Lo!
Warum schreibst du das XmlDocument nicht gleich mit Save(filename) in eine Datei? Oder nimm den Inhalt als String und schreib den dann im gewünschten Encoding in die Datei.
Der MemoryStream scheint mir hier ein umständlicher Umweg.
Warum schreibst du das XmlDocument nicht gleich mit Save(filename) in eine Datei? Oder nimm den Inhalt als String und schreib den dann im gewünschten Encoding in die Datei.
Der MemoryStream scheint mir hier ein umständlicher Umweg.
Hallo, habe es nun umgeschrieben:
System.IO.Stream fileStream;
XmlDocument doc = new XmlDocument();
XmlNode myRoot, myNode;
myRoot = doc.CreateElement("test");
doc.AppendChild(myRoot);
for (int i = 0; i <= a; i++)
{
myNode = myRoot.AppendChild(doc.CreateElement("node"));
myRoot.SelectNodes("node").Item(i).Attributes.Append(doc.CreateAttribute("param")).InnerText = i.ToString();
}
fileStream = saveFileDialog1.OpenFile();
string test=doc.ToString();
System.IO.StreamWriter test2 = new System.IO.StreamWriter(fileStream,Encoding.UTF8);
doc.Save(fileStream);
Sobal jetzt ein Umlaut vorkommt speichert er als UTF-8. Wenn aber kein Umlaut vorkommt speichert er als ANSI. Wie kann ich ihn dazu zwingen als UTF-8 zu speichern?
Hi!
Sobal jetzt ein Umlaut vorkommt speichert er als UTF-8. Wenn aber kein Umlaut vorkommt speichert er als ANSI. Wie kann ich ihn dazu zwingen als UTF-8 zu speichern?
Wenn du nur ASCII-Zeichen hast, dann gibt es keinen Unterschied zwischen UTF-8 und ISO-8859-1 und ANSI/ASCII.
Lo!
Wenn du nur ASCII-Zeichen hast, dann gibt es keinen Unterschied zwischen UTF-8 und ISO-8859-1 und ANSI/ASCII.
Lo!
Das Problem ist aber, dass ggf. Nutzer die XML-Datei mit dem Editor bearbeiten und nachträglich Umlaute abspeichern. Da ist dann das Problem, dass diese im ANSI Format abgespeichert werden, außer man ist so versiert, dass man manuell als UTF-8 abspeichert.
Hallo,
Wenn du nur ASCII-Zeichen hast, dann gibt es keinen Unterschied zwischen UTF-8 und ISO-8859-1 und ANSI/ASCII.
Das Problem ist aber, dass ggf. Nutzer die XML-Datei mit dem Editor bearbeiten und nachträglich Umlaute abspeichern. Da ist dann das Problem, dass diese im ANSI Format abgespeichert werden, außer man ist so versiert, dass man manuell als UTF-8 abspeichert.
das stimmt, das Problem wirst du aber nicht auf technische Art lösen können, denn die Konsequenz aus dedlfix' Feststellung ist, dass es unmöglich ist, die gewünschte Codierung eines Dokuments festzustellen, solange nur ASCII-Zeichen darin vorkommen.
Du kannst also höchstens die Anwender deutlich darauf hinweisen, dass das Dokument bei Änderungen *immer* als UTF-8 gespeichert werden muss.
Oder integriere irgendein Element in dein XML, das du selbst (bzw. dein Programm) grundsätzlich ignoriert, und schreib da ein paar Umlaute rein, an denen die Codierung UTF-8 erkennbar ist.
Oder bau eine Fehlerbehandlung in deinem Programm ein, die bei Codierungsfehlern alternativ versucht, die zu lesende Datei von ISO/Latin in UTF-8 umzucodieren.
Keine dieser Lösungen ist perfekt ...
So long,
Martin