utf-16 codierte file einlesen und bearbeiten



  • Hallo

    ich hab ein Problem.

    ich habe eine Datei in der sich utf-16 codierter Text befindet und den muss ich einlesen und dann bearbeiten.

    es gibt zwar wstring aber den kann ich nicht mit ifstream einlesen 😞

    ich hab schon versucht die datei binär in shorts einzulesen und dann in wchar_t zu konvertieren aber das haut nich hin 😞

    //---------------------------------------------------------------------------
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    //---------------------------------------------------------------------------
    
    int main(int argc, char* argv[])
    {
    ifstream in("BuildLog.htm",ios::binary);
    unsigned short i;
    
        in>>i;
    	cout<<i;
    
    getchar();
    
    	return 0;
    }
    

    bringt lustigerweise je nach Compiler aber mit den selben Datei unterschiedliche Ausgaben.

    was könnte ich den da machen? gibt es vieleicht eine bibliothek die sowas für mich machen könnte ?



  • Hallo,

    und wenn du statt ifstream hier wifstream nimmst?



  • wstring ist kein utf-16! Der Standard legt nicht fest, welches Encoding wchar_t unterstützt. Also kannst du dir eh nicht sicher sein, dass das 16bit sind. Auf meinem System ist wchar_t zB 32 Bit groß (für UCS-4) und dann ist basic_string nicht für Multibyte-Zeichensätze ausgelegt!

    Wenn du also utf-16 benutzen willst, dann lies mittels eines 16 Bit großen Typs (zB boost::uint16_t aus <boost/cstdint.hpp> oä) die Datei ein und wandel die am besten in etwas um, was kein Multibyte ist (eben UCS-4) (oder nimm eine String-Klasse, die Multibyte-Daten handeln kann zB glib::ustring). Dafür gibt es auch Libraries. Irgend so ein Zeugs von IBM (ICU oder so heißt das), iconv und mehr.



  • 😃 das ich da nich draufgekommen bin.
    Wenn es wstring gibt gibts auch wifstream , wcout gibts auch ^^

    wchar_t ist bei mir schon 16bit groß sollte also schon funktionieren, ich probier das gleich mal aus.



  • Du kannst trotzdem wstring nehmen. wstring ist ja nur der Runtime-String und völlig unabhängig von den Strings in der Datei. Das Prinzip funzt so: Datei in UTF-16? Dann mußt du es in den wstring convertieren. Ist wstring UTF-32, heißt das: UTF-16 nach UTF-32 convertieren. Szenarios sind beliebig austauschbar, wichtig ist nur, das du einen Converter findest.

    http://www.kharchi.de/cpp_strings.html#Zeichencodeumwandlung_ASCII_UCS_und

    Dinkumware Ltd. bietet ne ganze Palette von Convertern an.



  • walljumper schrieb:

    😃 das ich da nich draufgekommen bin.
    Wenn es wstring gibt gibts auch wifstream , wcout gibts auch ^^

    wchar_t ist bei mir schon 16bit groß sollte also schon funktionieren, ich probier das gleich mal aus.

    Wird meistens nicht funktionieren, weil die meisten fstream-Implementierung nur ASCII können.



  • naja hast recht haut nicht ganz hin. nach dem einlesen gehts ja noch das fehlen nur die leerzeichen und es sind ein paar komische zeichen am anfang des strings aber wenn ich wieder in eine datei schreibe kommen nur asiatische zeichen raus.

    naja dann halt mit den convertern. danke artchi 🙂


Anmelden zum Antworten