Unicode Files



  • Gibt es eine Möglichkeit Ansi und Unicode Files mit C++ Funktionen zu öffnen, einzulesen und zu schliessen? Wie konvertiere ich einen std::wstring nach std::string - mit einem std::ostringstream oder vielleicht boost::lexical_cast?

    Anmerkung: Die Unicode Files enthalten nur Ansi-Zeichen!

    Gruss
    T.



  • Hallo,

    Ich mache das so

    std::string wstring2string( const std::wstring& src, std::locale loc) {
    	size_t size = src.size();
    	char* Narrow = new char[size+1];
    	std::use_facet<std::ctype<wchar_t> > (loc).narrow(src.c_str(), src.c_str() + size, ' ', Narrow);
    	Narrow[size] = '\0';
    	std::string res(Narrow);
    	delete[] Narrow;
    	return res;
    }
    

    Das geht mit Sicherheit eleganter. 🙂



  • Da der Aufruf use_facet<blablabla.. werfen kann würde ich für Narrow einen std::vector benutzen.



  • Oder auto_ptr/scoped_ptr. vector ist nur unbedingt Pflicht, wenn man die Daten später noch kopieren will. Wobei sich die Frage stellt, ob der Aufwand überhaupt notwendig ist? Wenn Unicode gleich UTF8 ist, ist er völlig überflüssig. Andererseits wirst du Probleme bekommen, wenn sizeof(wchar_t) == 2, aber die Datei UTF32 ist.



  • hav a break schrieb:

    Oder auto_ptr/scoped_ptr.

    Die delete und nicht delete[] aufrufen, was hier falsch wäre. Wenn dann boost::scoped_array. Den gibts aber eben nur in boost, nix STL (die den hier wunderbar geeigneten vector hat).



  • Hast recht, soweit hab ich jetzt nicht mitgedacht. Ich dachte nur an RAII und Pointer freigeben. scoped_ptr hätte ich persönlich aber auch wegen boost hintenan gestellt.



  • Ok,

    std::string wstring2string( const std::wstring& src, std::locale loc) {
        size_t size = src.size();
        std:vector<char> Narrow(size);
        std::use_facet<std::ctype<wchar_t> > (loc).narrow(src.c_str(), src.c_str() + size, ' ', &(Narrow[0]); // hier evtl. auch Narrow.begin()?
        return std::string(Narrow.begin(), Narrow.end());
    }
    

    So besser?


Anmelden zum Antworten