WCHAR*



  • WCHAR *wch = L"test";
    

    Der obige Code funktioniert ja so.
    Wie kann ich das jedoch lösen, wenn ich den String nicht direkt zuweisen kann, sondern in einem CString habe?

    CString str = "test";
    
    // Funktioniert beides nicht
    WCHAR *wch = str;
    WCHAR *wch = L(str);
    


  • Versuch mal:

    CString csTest = _T( "Test" );
    


  • Ne, funktioniert leider auch nicht.
    Um mein eigentliches Problem noch mal genauer zu beschreiben:

    Ich will sozusagen einen CString in ein WCHAR* konvertieren, sodass beispielsweise die Konvertierung eines CStrings "test" in ein WCHAR* die selbe Wirkung hat, als ob man "test" direkt dem WCHAR* mit Hilfe dieses L"..." zugewiesen hätte (WCHAR* wch = L"test").



  • das hat doch was mit unicode und so zu tun.

    check mal MultiByteToWideChar(...) oder andersrum.

    so ganz gerafft hab ich das selbst noch nicht, wobei ich das hier

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-161855.html

    sehr gut fand.


  • Mod

    Wenn Du VS.NET 2003 oder 2005 verwendest kannst Du direkt CStringW verwenden.
    Oder bau Dein gesamtes Projekt gleich in Unicode.



  • Das hat in der Tat etwas mit Unicode zu tun.
    Ich versuche momentan eine UTF8 Encoding Funktion zu schreiben.
    Mein bisheriger Code:

    CString EncodeUTF8(WCHAR *AnsiText)
    {
    	int iRes = WideCharToMultiByte(CP_UTF8, 0, AnsiText, -1, NULL, 0, NULL, NULL);
    	TCHAR *szTemp = new TCHAR[iRes];
    	iRes = WideCharToMultiByte(CP_UTF8, 0, AnsiText, -1, szTemp, iRes, NULL, NULL);
    	CString UTF8Text = szTemp;
    	delete [] szTemp;
    	return UTF8Text;
    }
    

    Wenn ich daher diese Funktion zum Beispiel so aufrufe EncodeUTF8(L"test") funktioniert das ganze auch schon so wie ich mir das vorstelle. Um diese Funktion jedoch auch effizient benutzen zu können, müsste ich ihr einen CString übergeben. Deshalb auch meine Frage, wie man einen CString in ein WCHAR* konvertiert. Das Gegenstück zu dieser Funktion funktioniert bereits einwandfrei:

    CString DecodeUTF8(CString UTF8Text)
    {
        int iRes = MultiByteToWideChar(CP_UTF8, 0, UTF8Text, -1, NULL, NULL);
    	WCHAR *szTemp = new WCHAR[iRes];
    	iRes = MultiByteToWideChar(CP_UTF8, 0, UTF8Text, -1, szTemp, iRes);
        CString AnsiText = szTemp;
        delete [] szTemp;
        return AnsiText;
    }
    


  • Wie kann man den Unicode in einem CString speichern ohne unicode unterstützung.

    hast du dir mal die beispiele in dem link angeguckt? da sind doch entsrechende
    konvertierungsfunktionen drin.

    hab auch noch nicht ganz verstanden, was du machen willst 😉



  • Beispiel:

    Encode:
    hää?? -> hää??

    Decode:
    hää?? -> hää??

    @Smeagol
    Das was ich damit machen will funktioniert sehr wohl damit. Mein einziges Problem besteht noch in der CString zu WCHAR* Konvertierung.



  • @Martin Richter
    Ich benutze den MS VC++ 6.0 Compiler.



  • Also zurück zum eigentlichen Problem (CString -> WCHAR*).
    Ich hab hierfür jetzt endlich eine Funktion die auch tut was sie soll:

    WCHAR* CString2WCHAR(CString str)
    {
    	LPWSTR lpszW = new WCHAR[str.GetLength()];
    	LPTSTR lpStr = str.GetBuffer(str.GetLength());
    	int nLen = MultiByteToWideChar(CP_ACP, 0,lpStr, -1, NULL, NULL);
    	MultiByteToWideChar(CP_ACP, 0, lpStr, -1, lpszW, nLen);
    	WCHAR* wch = lpszW;
    	//delete[] lpszW;
    	return wch;
    }
    

    Jedoch verursacht das hier im Code auskommentierte delete einen Error bei der Ausführung des Programms. Wegen des new brauch ich jedoch am Ende auch ein delete. Warum funktioniert das also nicht bzw. wie kann ich das zum Laufen bringen?


  • Mod

    Logisch bei dieser Konvertierung musst Du den Speicher auch wiederferigeben.

    Lösung:
    In dem Du die T2W oder CT2W Makros z.B. verwendest!



  • Und bitte nicht die "alten" T2* Makros verwenden, sondern die neuen CT2* Makros!
    Sonst hast Du Probleme mit Deinem Stack, wenn Du T2* in einer Schleife aufrufen solltest...


Log in to reply