wxWidgets und Umlaute
wxWidgets und Umlaute
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
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
edit: ich versuche noch schnell ein minimales Programm zusammenzustellen welches mein Problem erklärt
gruß stampuhh
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
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
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
Re: wxWidgets und Umlaute
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
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
- Xin
- nur zu Besuch hier
- Beiträge: 8859
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: wxWidgets und Umlaute
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.
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: wxWidgets und Umlaute
kein Problem Ich habe eh nur hin und wieder mal Zeit um mich damit zu beschäftigen...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.
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");
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
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
- cloidnerux
- Moderator
- Beiträge: 3123
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: wxWidgets und Umlaute
Du kannst über ieinen Trick/Signatur/Startzeichen Feststellen, ob es sich um einen AscII oder UFT-8 Text handelt.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
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
quod erat expectandum
Re: wxWidgets und Umlaute
Ok "Config" war vielleicht doof gewählt der Name
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.
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...
gruß stampuhh
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.
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.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?
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...
Den kenne ich noch nicht. Google hat mich auf eine "AEdiX Suite" verwiesen?Aedix hat sich bei mir bewährt.
gruß stampuhh
NachDenkSeiten.de
Re: wxWidgets und Umlaute
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
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.
Hier der entsprechende Code-Teil
Code: Alles auswählen
m_treeCtrl1->AppendItem(names, wxString(name, wxConvUTF8));
They say, if you play a Microsoft CD backwards, you hear satanic messages. Thats nothing, cause if you play it forwards, it installs Windows.
Re: wxWidgets und Umlaute
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:
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
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"));
Dann sollte ich wohl besser wenn ich mit wxWidgets arbeite komplett bei wxString bleiben wenn es nicht anders sein muss^^
gruß stampuhh
NachDenkSeiten.de
Re: wxWidgets und Umlaute
Du kannst auch weiterhin die ANSI Variante benutzen, bloß musst du dann halt wchar_t* statt char* benutzen, dann sollte es eig. auch funktionieren
Leider wurde aber das wchar_t Zeugs wie wcout und so noch nicht von MinGW portiert, weshalb wcout und so nicht funktioniert
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.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
Leider wurde aber das wchar_t Zeugs wie wcout und so noch nicht von MinGW portiert, weshalb wcout und so nicht funktioniert
They say, if you play a Microsoft CD backwards, you hear satanic messages. Thats nothing, cause if you play it forwards, it installs Windows.