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;