Problem mit Zeichensätzen
-
kann mir jemand erklären, warum der Aufruf
MessageBox(NULL, "Hallo", "Überschrift", MB_OK);folgenden Fehler Produziert:
j:\msvs projekte\directx tutorial\dxtut01\dxtut01\main.cpp(72) : error C2664: 'MessageBoxW': Konvertierung des Parameters 2 von 'const char [5]' in 'LPCWSTR' nicht möglichich konnte immerhin schon rausfinden, dass es wohl mit dem unicode-zeichensatz zusammenhängt. also hab ich mir gedacht, machen wirs halt so:
TCHAR text, caption; char eins[] = "lalalaalla", zwei[] = "dfkgjb"; text = (TCHAR)eins; caption = (TCHAR)zwei; MessageBox(NULL, (LPCWSTR)text, (LPCWSTR)caption, MB_OK);das führt dann dazu, dass zwar der compiler nicht mehr nörgelt, aber die ausgabe leer ist.
ich hab vorher normalerweise winapi mit ANSI C programmiert. da konnte ich dann ganz einfach string-literale und char* an funktionen, die zeichenketten erwarten übergeben. und für mfc anwendungen kann man wohl das _T() makro verwenden um zeichenketten entsprechend umzuwandeln, was auch immer dies im detail tut.
aber nun habe ich den fall, dass ich in einem directx-tutorial eine windows anwendung erstellen wollte mit MS Visualstudio 2005 und in meinem programm praktisch keine literale verwenden kann, bzw es nicht mal hinkriege eine msgbox herzustellen, die "hallo" sagt.
nun gut, kommt also jetzt der zeitpunkt sich genauer mit den zeichensätzen auseinanderzusetzen, aber mir fehlt leider jedweder anhaltspunkt in dieser hinsicht. was ich in der doku finden konnte, war leider nur die ansage, dass windows halt den typ LPCWSTR definiert, aber das hilft wohl nur leuten weiter, die eh schon bescheid wissen.
wie kann ich denn feststellen oder kontrollieren, welchen zeichensatz mein programm verwendet und wie kann ich im falle von unicode eine messagebox "hallo" sagen lassen?
wenn man als anfänger auf dieses thema trifft, fühlt es sich irgendwie an, als würden microsoft-programmierer einem eine tastatur ins gesicht schlagen.
wenn mir hier jemand weiterhelfen könnte, wäre das echt super. ich hoffe, ich verlange nicht zuviel. ich habe leider keine ahnung, welche ausmaße dieses thema evtl. hat.gruß & danke
-
Hallo jule37,
hatte Anfangs auch Probleme mit diesem Unicode Zeugs, bin aber so langsam durch das Thema durchgestiegen.
Um ein bisschen die Basics zu erklären. Eigentlich gibt es die Funktion MessageBox so gar nicht.
Es gibt nur MessageBoxA (für Ansi) und MessageBoxW (für Unicode) und je nach
Einstellung wird entweder die Ansi- oder die Wideversion von MessageBox genommen.Also hast du bei den IDE Settings deines Projekts Unicode definiert. Nun will der Compiler für MessageBoxW auch einen Wide String, den du ganz einfach so erhälst:
L"Das ist ein Wide String" im Gegensatz zum Ansi String: "Das ist ein Ansi String".Praktisch alle Funktionen der WinAPI in denen ein String als Parameter vor kommt, gibt es als Unicode und Ansi Variante, die "Standartfunktion" (z.B. MessageBox)
ist nur ein Platzhalter für die Wide- und Ansifunktion.TCHAR ist übrigends auch je nach Einstellung einmal char und einmal wchar_t
und das Makro _T() kannst du auch verwenden, wenn du TCHAR.h in dein Projekt einbindest.Für weitere Infos zu Unicode was das Thema angeht kann ich diese Seiten empfehlen:
http://www.triptico.com/software/unicode.htmlhttp://www.cl.cam.ac.uk/~mgk25/unicode.html
Gruß
yogle
-
Wenn Du WinAPI verwendest, dann solltest Du beachten, dass hier meistens mit dem TCHAR Datentyp gearbeitet wird!
=>MessageBox(NULL, _T("Hallo"), _T("Überschrift"), MB_OK);TCHAR text[] = _T("lalalaalla"); TCHAR caption[] = _T("dfkgjb"); MessageBox(NULL, text, caption, MB_OK);
-
super! danke euch jungs, hab nen stein vom herzen

-
jule37 schrieb:
hab nen stein vom herzen
Ist das was bedenkliches? Sonst geh mal schnell zum Arzt...