Konvertierung eines CStrings in einen WideString. Wie?



  • Hi Leute,
    Ich hab hier ein kleines Problem: Ich muss aus einem CString einen WideString machen. Konkret geht es um Dateinamen.
    In dem CString steht folgendes: (Byte für Byte)

    83 52 83 73 81 5b 20 81 60 20 55 6e 62 65 6e 61 6e 6e 74 2e 74 78 74

    Herauskommen sollte folgendes:

    B3 30 D4 30 FC 30 20 00 5E FF 20 00 55 00 6E 00 62 00 65 00 6E 00 61 00 6E 00 6E 00 74 00 2E 00 74 00 78 00 74 00

    So mach ich das momentan:

    wchar_t ws[2048];
    	for(int j=0;j<src.GetLength();++j)
    	{
    		ws[j]=BYTE(src[j]);
    	}
    

    src ist die CString-Variable. Bei dem Code kommt natürlich das selbe raus wie schon im CString steht, nur nach jedem Byte eben ein 0-Byte:

    83 00 52 00 83 00 usw

    Hab das aus nem Delphisource:

    var
      ws: WideString;
    begin
      ws := src;
    end;
    

    Aber in Ermangelung eines WideStrings habe ich mir obige Schleife gebastelt. Bei normalen Buchstaben, die im ASCII-Zeichensatz sind, ist's ja kein Problem, aber z.b. auf japanischen Systemen klappt das ganze nicht mehr.
    Ewiglanger Beitrag, ziemlich kurze Frage: Wie bekomm ich die Konvertierung gescheit hin? 🙄



  • CString m_sTarget, m_sNick, m_sMsg;
    	m_sTarget="Hallo";
    	m_sNick = "Jens";
    	m_sMsg = "Hallo";
        const int MAXLEN = 256;
        wchar_t name[MAXLEN], from[MAXLEN], msg[MAXLEN];
    
        mbstowcs( name, m_sTarget.GetBuffer(0), MAXLEN );
        name[MAXLEN - 1] = L'\0';
        mbstowcs( from, m_sNick.GetBuffer(0), MAXLEN );
        from[MAXLEN - 1] = L'\0';
        mbstowcs( msg, m_sMsg.GetBuffer(0), MAXLEN );
        msg[MAXLEN - 1] = L'\0';
    

    Vieleicht hilfts.

    Devil



  • Nein, hilft leider nicht. Das scheint das selbe zu machen wie meine Schleife. Zumindest ist das Ergebnis das selbe.



  • hmm.. ist dafür net MultiByteToWideChar da? oder hab ich was falsch verstanden?



  • MultiByteToWideChar wird in mbstowcs (=MultiBytesToWideChars 😉 ) verwendet.
    So wie's aussieht hab ich aber die Lösung:

    #ifdef _UNICODE 
    	::wcscpy( ws, ( LPCTSTR ) src ); 
    #else 
    	USES_CONVERSION; 
    	::wcscpy( ws, A2W( (LPCTSTR)src ) ); 
    #endif
    


  • A2W --> ... --> AfxA2WHelper

    LPWSTR AFXAPI AfxA2WHelper(LPWSTR lpw, LPCSTR lpa, int nChars)
    {
    	if (lpa == NULL)
    		return NULL;
    	ASSERT(lpw != NULL);
    	// verify that no illegal character present
    	// since lpw was allocated based on the size of lpa
    	// don''t worry about the number of chars
    	lpw[0] = ''\0'';
    	VERIFY(MultiByteToWideChar(CP_ACP, 0, lpa, -1, lpw, nChars));
    	return lpw;
    }
    }
    

    WideCharToMultiByte *hust*
    ist das net genau das was wir beiden schon geschieben haben? :p



  • Hum 😕
    Komisch. Wenigstens tut die Version im Gegensatz zu allem anderen, was ich probiert hab 😉



  • dEUs schrieb:

    wchar_t ws[2048];
    	for(int j=0;j<src.GetLength();++j)
    	{
    		ws[j]=BYTE(src[j]);
    	}
    

    wie wärs mit

    CComBSTR wstr=src;
    

Anmelden zum Antworten