wfstream/fstream: Unicode in File schreiben



  • Hi,

    wie kann ich mit wfstream/fstream Unicode-Daten in Files schreiben?

    Ich habe wfstream verwendet weil ich dachte, dass damit Unicode geschrieben wird. Leider scheit sich das 'w' auf den verwendeten Buffer zu beziehen 😞

    MfG

    Matg40



  • die ganzen w... Klassen (wstring, wfstream, wirgendwas,...) arbeiten intern mit wchar_t anstelle von char. Allerdings ist im C++ Standard (afaik) nicht festgelegt, welche UNICODE-Encodierung sie verwenden müssen (oder ob sie sich überhaupt darum kümmern müssen, die UNICODE-Daten zu interpretieren).



  • Hi,

    kann ich da irgendwie angeben, dass er Unicode rausschreiben soll?

    Ich habe eine Preamble (0xFFFE) gefunden, die angibt, dass die Datei im Unicode-Format ist.

    Aber reicht das (einfach davor setzen danach und normal schreiben)?

    MfG

    Matg40



  • wfstream schreibt schon in Unicode - allerdings legt der Standard nicht fest, welche der vielen Formatierungen (UTF-8, UTF-16 LE,...) verwendet wird (und wie er mit der BOM umgeht). Da müsstest du dich notfalls selber drum kümmern.

    (ich bin nicht 100% sicher, aber afair wird die Unicode-Verarbeitung von der codecvt<>-Facette übernommen)



  • Hi,

    kann ich die Preamble nicht irgendwie selbst setzen?

    Ich hab versucht, sie einfach ins wchar_t-Array zu setzen, aber das ging nicht...

    w_memblock_out[0] = 0xFFFE;

    MfG

    Matg40



  • Praktisch sind alle Std-Lib-Implementierungen ohne Unicode-Konvertierung bereitgestellt. Da aber die Std-Lib flexibel ist, kannst du einfach eine Unicode-Konvertierung "einhängen". Und das geht über eine eigene codecvt-Implementierung. Die standardmäßig verwendete std::codecvt radiert alle Zeichen größer 255 weg.

    Hier eine Grafik um das Konzept zu verdeutlichen:
    www.kharchi.de/codecvt.png

    So, entweder du implementierst dir dein eigenes codecvt, oder du besorgst dir eine fertige Implementierung. In der Boost-Serialization-Library ist eine UTF8-codecvt enthalten, die man benutzen könnte. Einfach mal google mit den Suchbegriffen bemühen.

    Wenn du ein richtig leistungsfähige codecvt-Sammlung brauchst (also mit wirklich allen möglichen und unmöglichen Codeconvertern), dann solltest du dir die Standardlib von Dinkumware kaufen, da sind so ca. 30 codecvt's enthalten. Kostet glaub ich so knapp 100 US$. Wer viel mit Codepages u.ä. hantieren muß, sollte das in Betracht ziehen.



  • Hi,

    Vielen Danke erstmal für die Antworten !!! 👍

    Ich habs jetzt so gelöst:

    • Mit WriteFile die Preamble ins File geschrieben (als WORD)
    -->rausgeschrieben
    • Den String intern konvertiert (mbstowcs)
    -->rausgeschrieben

    Es scheint (für meine bescheidenen Zwecke 😉 auszureichen...

    MfG

    Matg40


Log in to reply