wxWidgets und Umlaute

z.B. wxWidgets, GTK+, Qt, OpenGL, DirectX
Antworten
Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

wxWidgets und Umlaute

Beitrag von stampuhh » Mo Mai 10, 2010 6:01 pm

Hey zusammen,

ich versuche mich gerade ein wenig mit wxWidgets. Die GUI erzeugen klappt soweit wie gewollt. Jetzt wollte ich einfach mal eine Liste von Namen aus einer Datei einlesen und in einer wxTreeCtrl anzeigen lassen. Klappt auch wunderbar bis zu dem Zeitpunkt wo deutsche Umlaute (ä,ü,ö) ins Spiel kommen ;)

Diese werden dummerweise nicht dargestellt. Wenn ich allerdings per Hand einen Text übergebe, der Sonderzeichen enthält, dann klappt das ohne Probleme. Es muss also irgendwie damit zusammenhängen wenn ich die Zeichen aus der Datei einlese und speicher und dann an die wx-Elemente übergebe.

Wenn ich die abgespeicherten Variablen wieder in eine Datei schreibe stehen sie natürlich wieder richtig drin :roll:

Hat irgendwer eine Ahnung wo das Problem liegt (ich schätze mal Unicode) und wie ich da am besten ansetzen kann?

Ach ja ich arbeite gerade unter Windows mit Codeblocks und MinGW und habe außer char* bisher noch nicht viel benutzt :D

edit: ich versuche noch schnell ein minimales Programm zusammenzustellen welches mein Problem erklärt ;)

gruß stampuhh
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
NachDenkSeiten.de

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: wxWidgets und Umlaute

Beitrag von stampuhh » Di Mai 11, 2010 1:28 pm

ok, da anscheinend keiner eine Ahnung hat oder einfach niemand mein Problem verstanden hat ein neuer Versuch ;)

Wie arbeitet ihr mit Strings die Umlaute enthalten? Da ich ja recht neu in C++ bin würde mich das einfach mal interessieren. Und irgendwie hat man ja auch eine im Vergleich zu Java große Auswahl. Ich habe bisher nur mit char* gearbeitet aber in C++ gibt es ja wohl andere Varianten?

Ich hab gestern schon ein bisschen noch mit wchar_t rumgespielt aber der MinGW ist da anscheinend nicht so der Freund von...auch so Sachen wie wcout oder wcin lassen sich nicht wirklich compilieren :(

Soll ich wenn ich mit wenn ich mit wxWidgets arbeite auch gleich wxString verwenden?

Auf mein oberes Problem darf natürlich auch noch geantwortet werden...

gruß stampuhh
NachDenkSeiten.de

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: wxWidgets und Umlaute

Beitrag von Xin » Di Mai 11, 2010 2:14 pm

Du hast ein Testprogramm geschrieben, dass ich mir ansehen wollte, sobald ich Zeit habe.
Blöderweise ist bei mir bis einschließlich Dotag aber schon wieder alles dicht.

Aufpassen musst Du damit, wie Dein Editor die Quelltexte abspeichert, also mit welcher Codepage. Die muss identisch mit der Codepage sein, die wxWidgets erwartet. Heißt: Wenn Dein Computer das 'Ä' auf Position 196 ablegt, aber wxWidgets ein 'Ä' auf 136 erwartet, dann zeigt wxWidgets nunmal das Zeichen an, dass wxWidgets unter dem Zeichen 196 anzeigen soll.

Das muss entsprechend übereinstimmen, damit das klappt. Deswegen kannst Du das 'Ä' vielliecht als '0xC4' (196) in den Quellcode packen. Wenn wxWidgets mit UTF8 arbeitet, schau mal auf meine Homepage, da findest Du eine entsprechende Tabelle, weil ich das Problem bereits mit GTK hatte und kannst UTF-16 Zeichen (die Du unter Windows mit dem Tool 'charmap' herausfinden kannst) dir in UTF-8 umrechnen lassen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: wxWidgets und Umlaute

Beitrag von stampuhh » Di Mai 11, 2010 3:12 pm

Du hast ein Testprogramm geschrieben, dass ich mir ansehen wollte, sobald ich Zeit habe.
Blöderweise ist bei mir bis einschließlich Dotag aber schon wieder alles dicht.
kein Problem ;) Ich habe eh nur hin und wieder mal Zeit um mich damit zu beschäftigen...

Also wenn ich bei mir in den Quellcode ein "ä" schreibe, zB um beim Beispiel zu bleiben

Code: Alles auswählen

m_treeCtrl1->AppendItem(names, "Müller");
dann funktioniert das dummerweise. Mein Problem ist ja wenn ich "Müller" aus einer (config) Datei einlese dann wird aus Müller halt irgendwas komisches und ich weiß nicht wie ich da rangehen muss um das Problem zu finden. Die Datei in meinem Beispiel oben ist UTF-8 kodiert.
Als ANSII wiederrum klappt das ganze...ist es nicht möglich das aus der Datei unabhängig von der Kodierung korrekt einzulesen? Muss man ja jedes mal darauf achten wie die Datei kodiert ist und der Windows Editor fällt schon mal raus zum bearbeiten :D
Oder muss ich wenn die Datei UTF-8 kodiert ist auch im Programm irgendwie etwas anderes als char* benutzen? zB dann std::wstring oder so? Und wxString hat ja auch noch mal die ganzen Libs als Unicode Version^^

Gerade noch etwas mit deinem Tool auf der HP rumprobiert. "M\xc3\xbcller" bei mir im Quelltext führt zu komischen Ergebnissen. Also da kann ich wohl ruhig "ü" schreiben.

gruß stampuhh
NachDenkSeiten.de

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: wxWidgets und Umlaute

Beitrag von cloidnerux » Di Mai 11, 2010 3:28 pm

ein Problem ist ja wenn ich "Müller" aus einer (config) Datei einlese dann wird aus Müller halt irgendwas komisches und ich weiß nicht wie ich da rangehen muss um das Problem zu finden. Die Datei in meinem Beispiel oben ist UTF-8 kodiert.
Als ANSII wiederrum klappt das ganze...ist es nicht möglich das aus der Datei unabhängig von der Kodierung korrekt einzulesen? Muss man ja jedes mal darauf achten wie die Datei kodiert ist und der Windows Editor fällt schon mal raus zum bearbeiten :D
Du kannst über ieinen Trick/Signatur/Startzeichen Feststellen, ob es sich um einen AscII oder UFT-8 Text handelt.
Der Windows-Editor Speichert normalerweise als Ascii, du solltest sowieso einen anderen Editor verwenden, Aedix hat sich bei mir bewährt.
Und um dein Problem genau zu verstehen:
Wenn du aus einer Ascii-Datei lädst, funktioniert alles korrekt, wenn du aber aus einer UFT-8 Dateilädst, dann gehts drunter und drüber?

Um dir evt schon weiterzuhelfen, es wäre vlt Sinnvoll für deine Config-Dateien einen kleinen Header einzubauen, der z.B alle Umlaute (ä, ö, ü, ß) enthält und beim Laden prüfst du, ob der Header Valide ist und gibst dementsprechend eine Fehlermeldung aus.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: wxWidgets und Umlaute

Beitrag von stampuhh » Di Mai 11, 2010 5:29 pm

Ok "Config" war vielleicht doof gewählt der Name :D

Es handelt sich um eine Liste aus Namen (.csv), die beim Start halt geladen werden sollen. Und es sind halt nicht unbedingt nur deutsche Namen. Die Liste wird automatisch in "UTF-8 ohne BOM" (so sagt es zumindest Notepad++) erzeugt und an der Kodierung kann ich leider auch nichts ändern (bzw. ich könnte die nachträglich ändern aber das will ich ja gerade nicht). Also suche ich nach einem Weg UTF-8-kodierte Dateien einzulesen und das eingelesene in wxWidgets anzuzeigen.
Wenn du aus einer Ascii-Datei lädst, funktioniert alles korrekt, wenn du aber aus einer UFT-8 Dateilädst, dann gehts drunter und drüber?
Genau. Mein Bsp. Programm welches ich oben verlinkt habe funktioniert halt mit ASCII kodierten Dateien so wie ichs gerne hätte. Als ich dann aber mal eine andere Datei verwendet hatte wie meine Test-Datei sahs halt blöde aus.

Arbeitest du mit char* oder wchar_t* oder ganz was anderem? Wenn ich das jetzt richtig verstanden habe dann sollte man char* bei Ascii verwenden...
Aedix hat sich bei mir bewährt.
Den kenne ich noch nicht. Google hat mich auf eine "AEdiX Suite" verwiesen?

gruß stampuhh
NachDenkSeiten.de

Benutzeravatar
hackmack
Beiträge: 85
Registriert: Do Mär 26, 2009 10:16 pm

Re: wxWidgets und Umlaute

Beitrag von hackmack » Di Mai 11, 2010 6:26 pm

Du kannst in wxWidgets mit Hilfe von wxString(const char* psz, wxMBConv& conv) einen char* String in einen UTF8 kodierten String konvertieren, bzw. dafür sorgen, dass ein solcher richtig angezeigt wird. Du kannst trotzdem auch noch ganz normale ASCII-Dateien einlesen - auch diese werden richtig angezeigt, da die ersten 128 Zeichen des Unicode-Zeichensatzes dem des ASCII-Zeichensatzes entsprechen:


Hier der entsprechende Code-Teil

Code: Alles auswählen

        m_treeCtrl1->AppendItem(names, wxString(name, wxConvUTF8));
Bei mir zumindestens gibt dein Code an der Stelle sogar einen Fehler, da die Unicodeversion von wxWidgets keine automatische Typenumwandlung von char* auf wxString durchführt, welcher ja der Typ des 2. Arguments von AppendItem ist.
They say, if you play a Microsoft CD backwards, you hear satanic messages. Thats nothing, cause if you play it forwards, it installs Windows.

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: wxWidgets und Umlaute

Beitrag von stampuhh » Di Mai 11, 2010 9:42 pm

Oki danke das hat auf jeden Fall schon mal geklappt.

Ich habe nicht die Unicode Version von wxWidgets benutzt sondern die ohne Unicode. Ich hatte bisher nur unerklärliche Fehlermeldungen mit der Unicodevariante. In dem Beispielprogramm treten die dooferweise nicht auf ;)

Habe das Beispiel jetzt mal mit der Unicode-Version compiliert (musste natürlich vorher ein paar Zeilen umschreiben damit das überhaupt funzt).
Dann habe ich das hier:

Code: Alles auswählen

wxString string2(name, wxConvUTF8);
m_treeCtrl1->AppendItem(names, string2);
m_treeCtrl1->AppendItem(names, wxString::FromAscii("Müller"));
eingefügt und jetzt wird beide Male richtig "Müller" angezeigt.

Dann sollte ich wohl besser wenn ich mit wxWidgets arbeite komplett bei wxString bleiben wenn es nicht anders sein muss^^

gruß stampuhh
NachDenkSeiten.de

Benutzeravatar
hackmack
Beiträge: 85
Registriert: Do Mär 26, 2009 10:16 pm

Re: wxWidgets und Umlaute

Beitrag von hackmack » Do Mai 13, 2010 8:43 pm

Du kannst auch weiterhin die ANSI Variante benutzen, bloß musst du dann halt wchar_t* statt char* benutzen, dann sollte es eig. auch funktionieren

stampuhh hat geschrieben:Ich hab gestern schon ein bisschen noch mit wchar_t rumgespielt aber der MinGW ist da anscheinend nicht so der Freund von...auch so Sachen wie wcout oder wcin lassen sich nicht wirklich compilieren :(
Das Problem hatte ich auch schon. Es liegt daran, dass Code::Blocks die Dateien normalweise im Zeichensatz "Windows-1252" (zumindestens unter Windows) abspeichert. Leider hat MinGW seine Probleme damit, in Dateien mit dieser Kodierung wchar_t zu verwenden. Du kannst allerdings den Standard-Zeichensatz, mit dem dein Code abgespeichert werden soll, unter Settings->Editor... und dort "Default Encoding when opening files" auf UTF-8 oder so was stellen.

Leider wurde aber das wchar_t Zeugs wie wcout und so noch nicht von MinGW portiert, weshalb wcout und so nicht funktioniert :cry:
They say, if you play a Microsoft CD backwards, you hear satanic messages. Thats nothing, cause if you play it forwards, it installs Windows.

Antworten