std::string-Funktionen unicodefähig machen



  • Die WinAPI-Funktionen sind aber kein Standard 😉 Auf jeden Fall kannst du davon ausgehen, daß wstring::c_str() einen wchar_t-Zeiger zurückgibt, und damit kompatibel zu den UNICODE-Funktionen der WinAPI ist.

    PS: Mit dem Typ hast du die korrekten Typ-Definitionen für jede Projekt-Einstellung:

    typedef basic_string<TCHAR> tstring;
    


  • Danke für die Antwort und sorry bezüglich der "Begriffsverwechslung"!

    Wenn ich nun ein Großteil der strings in wstring umgewandelt habe, wie ist es möglich diesen wstring per cout auszugeben, oder muss ich dafür eine andere Bildschrimausgabe verwenden?

    Gruß Ernst



  • Wenn du die STL-Anteile auf UNICODE umstellen willst, mußt du das schon komplett machen - das schließt die Verwendung der wchar_t-Streamklassen (wistream, wfstream etc) und -Standardstreams (wcin, wcout, wcerr und wclog) mit ein.



  • Ersetze 'cout' durch 'wcout' (... und 'wcin', 'wcerr' etc.).



  • Danke Konrad ! Leider hab' ich zu einem obigen Problem immernoch eine Frage. Mir ist immernoch nicht klar, wie ich z.B. bei der Funktion ::GetGetFileAttributes() einen wstring-Typ (den ich durch die obige Umwandlung bekommen habe) in den geforderten LPCSTR-Typ umwandeln (casten) kann. Vielleicht hast Du ja eine Idee für mich parat!?

    Gruß Ernst



  • Hallo, mit casten ist da nichts. Das erledigt aber die Methode 'c_str()':

    wstring test = L"Hallo, Welt";
    ::MessageBoxW(0, test.c_str(), 0, 0);
    


  • Danke hast mir sehr weitergeholfen ! Gruß Ernst.



  • generell mach ich das meistens auch so - also das ich alles in unicode entwickel

    bei vielen ist aber die moeglichkeit beliebt den code fuer multibyte und unicode compilierbar zu machen

    #ifndef DString
    	#if ((defined UNICODE) || (defined _UNICODE))
    		#define DString std::wstring
    		#define DIfStream std::wifstream
    		#define DOfStream std::wofstream
    		#define DfStream std::wfstream
    	#else
    		#define DString std::string
    		#define DIfStream std::ifstream
    		#define DOfStream std::ofstream
    		#define DfStream std::fstream
    	#endif
    #endif
    
    //...
    DString str = _T("No matter");
    //...
    //dann geht immer wunderbar 
    ::MessageBox(0, str.c_str(), str.c_str(), MB_OK);
    


  • Das ist ja grässlich - Wie wärs mit typedef?



  • Mr Evil schrieb:

    //dann geht immer wunderbar
    ::MessageBox(0, str.c_str(), str.c_str(), MB_OK);

    typedef std::basic_string<TCHAR> tstring;
    //... etc. pp.
    


  • Nach langer Umwandlungsarbeit hänge ich noch an einem weiteren kleinen Problem! Folgende Codezeile will der Compiler nicht umsetzen :

    if( wcscmp(fileName.cFileName, L".") != NULL  && wcscmp(fileName.cFileName, L"..") != NULL)
    		{
            ...
            }
    

    Da cFileName ein CHAR_WIN32_FIND_DATA-Typ ist, verträgt er sich nicht mit meiner wcscmp-Funktion, die natürlich einen const wchar_t* erwartet. Wie kann ich die Problematik an einfachsten lösen?

    Danke im voraus, Gruß Ernst.



  • Biste dir sicher, das CHAR_WIN32_FIND_DATA ein Typ ist? Selbst die MSDN spuckt null Ergebnisse aus.



  • Ne, Du hast recht !!! Ist ein CHAR[] ! Sorry.


Anmelden zum Antworten