Outputstream Encoding
-
Hallo Zusammen,
ich habe jetzt leider schon eine halbe Ewigkeit hier im Forum und auf anderen Seiten nach einer Lösung für mein Problem gesucht, bin aber leider noch nicht schlauer geworden. Vielleicht kann mir hier jemand helfen:
Ich möchte eine XML- Datei erstellen, diese soll nach der Erstellung gegen ein Schema geprüft werden.
Das XML-File erstelle ich durch einen ofstream, dort werden die gewünschten Daten in die Datei gestreamt.Das sieht bisher ungefähr folgendermaßen aus:
_outputFile.imbue(std::locale("de_DE.UTF-8"));
_outputFile.open( _fileName.c_str() );
...
_outputFile << Daten in Form von std::strings;Mein Problem ist nur, das anscheinend die Ausgabe in der Datei nicht in UTF8 vorliegt! Die Datei muss jedoch dieses Encoding besitzen, sonst meckert meine XML-Schema- Datei ein falsches Encoding an.
Kann mir jemand helfen, wie ich die Daten in ein UTF8 gerechtes Format bekomme?
Vielen Dank

-
sgealexmeier14 schrieb:
_outputFile <<Daten in Form vonstd::strings;Wide streams (
wostream/std::wofstream) und wide strings (std::wstring) nehmen?
-
Da wirst du eine externe Library für benötigen, z.B. libiconv.
In welchem Encoding hältst du denn die Daten (Texte) in deinem Programm?Aber warum verwendest du denn nicht gleich eine XML-Library, welche Encoding unterstützt? Eine Auswahl von XML-Libraries findest du z.B. unter http://lars.ruoff.free.fr/xmlcpp oder http://stackoverflow.com/questions/170686/best-open-xml-parser-for-c
-
Danke schon mal für eure Antworten

Die Daten liegen schon in UTF8 vor, die ich in den Outputstream jagen möchte. Von Daher habe ich gedacht, kann ich die Daten gleich mit dem ofstream rausschreiben. Nur ist dann am Ende das Encoding nicht UTF8 sondern ISO-...
Gibt es also auf diesem Wege keine Möglichkeit, ohne wofstream usw., die Dateien in eine UTF-8-Datei zu schreiben?
-
Hallo,
fehlt evtl. einfach das UTF8-BOM am Anfang der Datei: http://de.wikipedia.org/wiki/Byte_Order_Mark ?
-
Für UTF8 ist eine byte order mark sehr sehr ungewöhnlich, weil sie völlig unnötig ist. So ungewöhnlich, dass man fast davon ausgehen kann, dass die früher oder später zu Problemen führen wird (ich spreche aus leidiger Erfahrung).
-
Mal 'ne dumme Frage: Wie stellst du fest, welches Format das Ergebnis hat? Eigentlich sollte das nämlich funktionieren, wenn das Ausgangsmaterial schon UTF-8 ist, selbst (oder gerade) wenn man einfach gar nichts macht. Das schöne an UTF-8 ist ja gerade, dass es selbst für das älteste, dümmste Programm (z.B. ein Compiler oder die C++-Standardlib
) wie eine Folge von einfachen 8-Bit-Zeichen aussieht. Da müsste schon irgendwo eine aktive Konvertierung stattfinden und ich sehe gerade nicht, wo dies der Fall sein sollte. Außer du machst vielleicht beim Speichern des Quellmaterials schon etwas falsch, so dass dieses gar als UTF-8 vorliegt.
-
Ich bekomme die Daten aus einer UTF-8 kodierten Postgres-Datenbank.
Daher gehe ich davon aus, dass das Ergebnis auch in UTF-8 vorliegt?!Das BOM muss ich also nicht unbdedingt setzen?
-
sgealexmeier14 schrieb:
Das BOM muss ich also nicht unbdedingt setzen?
Genau. Die darfst du bei UTF8 sogar garnicht setzen, außer du willst Probleme heraufbeschwören.
-
Ok das ist schon mal gut zu Wissen.
Mein Problem ist leider immer noch nicht gelöst.
Ich habe leider auch zu wenig Erfahrung darin und muss mir das ganze Themengebiet überall zusammensuchen.Ich habe mal weitere Versuche gemacht, wie z.B. das hier:
<mein ofstream>.imbue (std::locale (std::locale ("de_DE.UTF-8"), new codecvt_byname<wchar_t, char, mbstate_t> ("UTF-8")));Die Ausgabedatei erfolgt leider immer noch als ISO-Encoding.
-
Mach einfach gar nix.
-
wie meinst du das?
-
sgealexmeier14 schrieb:
wie meinst du das?
Leite die Eingabe einfach durch, ohne irgendwelche locales oder so.
-
Aber dann ist es ja auch ISO und nicht UTF8

-
sgealexmeier14 schrieb:
Aber dann ist es ja auch ISO und nicht UTF8

Edit: Ich konnte es endlich lösen. Ich habe überall rumgesucht, nur nicht da, wo ich mir eigentlich sicher war, das es passt. Wie ihr schon mal gesagt hattet, lagen meine Daten nicht in UTF8 vor. Ich musste obwohl es eine UTF8-DB war, das Encoding ändern, da Standardmäßig ISO verwendet wird.
Es tut mir leid, dass Ihr mir wegen sowas helfen musstet.

Aber ich bedanke mich bei der schnellen Hilfe!Vielen Dank und Viele Grüße