Problem mit der Darstellung von Unicode in einer Combobox
-
Ich beziehe mich zunächst auf den Artikel http://www.codeproject.com/KB/database/sqlsrvenumerator.aspx
Ich konnte die dort dargelegten Vorgehensweisen zunächst mal so umsetzen, dass das Programm läuft und auch das tut was es soll.
Ich habe allerdings ein Problem mit der Darstellung von Unicode in der Combobox des Dialogfensters. Die Datenbank liefert bei der Abfrage alle verfügbaren Sprachen in einem String zurück. Dieser wird dann zerlegt und die einzelnen Fragmente in einem CStringarray gespeichert. Dort stehen die Substrings auch noch korrekt drin. Dies hab ich überprüft, indem ich mir diese mal in Messageboxen habe ausgeben lassen. Allerdings scheint das Problem bei der Funktion AddString der Comboboxcontrolvariablen aufzutreten. Dort werden dann einige Einträge mit schwarzen Strichen oder schwarz umrandeten Quadraten dargestellt. Das Projekt ist mit der Einstellung "Unicode-Zeichensatz verwenden" kompiliert worden. Ich verwende VS 2003.net SP1.
-
Zeig Code. Vermutlich castest Du einen Unicode String auf MSBC oder umgekehrt.
-
Ja evtl handelt es sich um ein encodingproblem. Von was für Unicode sprechen wir? Windows nutzt ja prinzipiell für die Darstellung UCS-2 in Form von wchar_t/TCHAR WCHAR. Liegen die Daten in der Datenbank evtl in anderer Form vor (beispielsweise UTF-8) dann muss erstmal konvertiert werden.
Auch zu beachten ist das die Unicode Schriftart ausgewählt ist im Dialogeditor und auch installiert ist (ich nehme mal an das ist der Fall).
Schau dir doch mal im Debugger an wie deine Strings auschauen (wenn es sich um UTF-8 handelt wirst du bei sonderzeichen Schmierzeichen vorfinden) -> dann konvertierung machen.
-
Martin Richter schrieb:
Zeig Code. Vermutlich castest Du einen Unicode String auf MSBC oder umgekehrt.
Also das hab ich zumindest nicht bewußt gemacht. Ich hab aber mal die Schriftart für die Combobox geändert:
BOOLTestDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon CString strSchriftart ="Tahoma"; //CString strSchriftart ="Arial Unicode MS"; //geht alternativ auch // Schriftart für die Combobox erstellen - Tahoma 14pt SchriftComboSprache.CreateFont(14, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, strSchriftart); // Der Combo-Box die neue Schriftart zuweisen m_ctlSprache.SetFont(&SchriftComboSprache); return TRUE; // return TRUE unless you set the focus to a control }
und schon wirds korrekt angezeigt. Warum hat die Schriftart der Controls bei Unicode-Projekten denn damit Probleme bei der Darstellung?
-
AndyDD schrieb:
Das Projekt ist mit der Einstellung "Unicode-Zeichensatz verwenden" kompiliert worden.
AndyDD schrieb:
CString strSchriftart ="Tahoma"; //CString strSchriftart ="Arial Unicode MS"; //geht alternativ auch
Da stimmt aber etwas nicht! Wenn das ohne Murren übersetzt, dann hast Du nicht UNICODE im Projekt eingestellt.
std::string str = "ANSI-String"; std::wstring wstr = L"UNICODE-String"; CString cstr = _T("Je nach Einstellung ANSI oder UNICODE");
siehe auch hier: http://www.flounder.com/cstring.htm
-
Roger Wilco schrieb:
Da stimmt aber etwas nicht! Wenn das ohne Murren übersetzt, dann hast Du nicht UNICODE im Projekt eingestellt.
std::string str = "ANSI-String"; std::wstring wstr = L"UNICODE-String"; CString cstr = _T("Je nach Einstellung ANSI oder UNICODE");
siehe auch hier: http://www.flounder.com/cstring.htm
Hmmm, stimmt auch irgendwie. Er hat es ohne Murren übersetzt. Problem ist, dass es ein altes VC6-Projekt ist. Aber in den Befehlszeilenoptionen stehts drin:
/Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /FD /EHsc /RTC1 /MTd /Yu"stdafx.h" /Fp".\Debug/SQLSrvEnumerator.pch" /Fo".\Debug/" /Fd".\Debug/" /W3 /nologo /c /ZI /TP
Vielleicht hat es ja doch was mit VC6 zu tun. Ich werde mal die Klasse in ein neues Projekt integrieren und schauen, was da rauskommt.
-
Ich glaube in VC6 war noch ein Zuweisung von char auf CString in Unicode möglich.
Seit VS-200x ist das nicht mehr möglich in der Template Variante.
-
Martin Richter schrieb:
Ich glaube in VC6 war noch ein Zuweisung von char auf CString in Unicode möglich.
Seit VS-200x ist das nicht mehr möglich in der Template Variante.
Und das heißt jetzt was genau?
-
Es kann sein, dass Dein Projekt wirklich im Unicode-Mode übersetzt wird und Dein CString trotzdem char-Strings (statt wchar_t-Strings) akzeptiert. Das ging aber wohl nur bis Visual C++ 6.0.