Wie das Thema schon oben... hab schon hunderte seiten abgesucht... nix vernünftiges was unter MFC funktioniert. Ich bekomme schon den CString auf LPWSTR umgewandelt aber nicht alle CString Zeichen sind dann auch in den LPWSTR drinne. Hat da jemand einen Vorschlag?
Warum definierst du nicht gleich _UNICODE für deine Anwendung? ... oder geht es dir wirklich explizit um die Umwandlung von ASCII nach Unicode?
CString ist portabel und beherrscht daher Unicode ohne Probleme, wenn es definiert ist. Das Beispiel von Black Man würde dann natürlich nicht mehr funktionieren, wäre aber auch nicht nötig.
Warum definierst du nicht gleich _UNICODE für deine Anwendung? ... oder geht es dir wirklich explizit um die Umwandlung von ASCII nach Unicode?
CString ist portabel und beherrscht daher Unicode ohne Probleme, wenn es definiert ist. Das Beispiel von Black Man würde dann natürlich nicht mehr funktionieren, wäre aber auch nicht nötig.
Entweder musst du in deinem Programm _UNICODE als Preprozessor Direktive definieren oder am in den Projekteinstellungen unter 'Character Set' setzen - je nachdem, womit du arbeitest.
Für die direkte Umwandlung, probiere mal folgendes: LPWSTR lpwstrMystring = T2W(strBla);
...oder auch, je nach ATL Version: LPWSTR lpwstrMystring = CT2W(strBla);
Den Type cast kannst du hier weglassen. Alternativ kannst du das aber auch davor schreiben: LPWSTR lpwstrMystring = CT2W((LPCTSTR)strBla);
Die Makros mit dem 'T' drin sind generisch. D.h. das sie im Falle von Unicode nichts machen, was ja in deinem Sinne sein sollte, und nur singly byte characters umwandeln. Spätestens wenn du auf UNICODE umstellst, wirst du dankbar sein, wenn du nicht alles neu anpassen musst
Es macht auch Sinn, wenn du generell die portablen Funktionen benutzt. Also TCHAR statt char, _tcscpy statt strcpy usw.
Also mit _T() wo vor setzen? vor dem CSTRING? ne damit hab ich kein Problem dass er den CSTRING nicht erkennt. mein Problem ist ich kriege den scheiss CString nicht vernünftig in LPWSTR umgewandelt.
Proktologe schrieb:
Das hatte ich auch mal
Einfach ein _T(exampleString); machen, sprich ein _T davor schreiben.
Entweder musst du in deinem Programm _UNICODE als Preprozessor Direktive definieren oder am in den Projekteinstellungen unter 'Character Set' setzen - je nachdem, womit du arbeitest.
Für die direkte Umwandlung, probiere mal folgendes: LPWSTR lpwstrMystring = T2W(strBla); <--- Funktioniert nicht... liegt ehe an der ATL version?
...oder auch, je nach ATL Version: LPWSTR lpwstrMystring = CT2W(strBla); <--- Funktioniert aber mit dem gleichen Scheiss erklärs später.
Den Type cast kannst du hier weglassen. Alternativ kannst du das aber auch davor schreiben: LPWSTR lpwstrMystring = CT2W((LPCTSTR)strBla);
Allgemein zu dem CString und Co. Also CString kann auch als LPCWSTR und LPCTSTR genutzt werden, soweit es in der Docu von Microsoft steht.
mein Hauptptoblem ist. Ich krieg den String umgewandelt aber nicht komplett. Ich kriege immer die ersten 2 oder 3 String in den LPWSTR umgewandelt und der rest verabschiedet sich. Na toll was soll ich den machen wenn ich den Rest nicht habe. Ich muss wahrscheinlich die einzelnen CString per hand Umwandeln. Mir fehlt aber dazu die Erfahrung.
also anhand des beispiels...
ich habe aus der DB den CString (alles was über CRecordset rauskommt wird automatisch an die Variable angepasst, ich glaube nur auf CString) "abcde" und wenn ich den umwandle auf auf LPWSTR bekomme ich nur "ab" raus. Reines CString bleibt so wie aus der DB. Das ist mein Hauptproblem. Die Darstellung ist im Arsch
hat da sonst eine noch ne idee?
ach ja Komischerweise werden nummerische Werte aus der Datenbank dadurch nicht beeinflusst. wenn ich 12345 habe dann wird es auch in 12345 auf LPWSTR konvertiert.
Eingeschränkt. LPCWSTR kannst du nur dann verwenden, wenn _UNICODE definiert ist.
Jedenfalls ist es seltsam, dass es so nicht funktioniert.
Probier doch mal: LPWSTR lpwstrMystring;
int iSizeOfWString = MultiByteToWideChar( CP_ACP, 0, strBla, strBla.GetLength()+1, wstrMystring,0); // gibt dir die benötigte Puffergröße für den wstring
lpwstrMystring = new WCHAR[iSizeOfWString];
MultiByteToWideChar( CP_ACP, 0, strBla, strBla.GetLength()+1, wstrMystring,iSizeOfWString);
Ich kann jetzt nicht überprüfen, ob es klappt aber schau dir halt mal die Funktion MultiByteToWideChar in der MSDN help an.