Hallo,
ich kann keine Umlaute unter Qt 3.3.3 unter Suse 9.2 ausgeben. (Qt
wurde mit Yast installiert.)
Code-Auszug:
#include
On Friday 20 May 2005 06:37, Peter Wabersich wrote:
ich kann keine Umlaute unter Qt 3.3.3 unter Suse 9.2 ausgeben.
(Qt wurde mit Yast installiert.)
Es ist völlig wurscht, wie man ein RPM installiert. YaST2 verwendet auch nichts anderes als "rpm".
Code-Auszug: #include
#include //für sprintf #include //für QString ..... QPainter p (this); QString s2; s2.sprintf("Höööööhe (neuer Test) in mm: %d",789 );
^^^^^^ Umlaute in ISO-8859-15 (oder -1) - also Latin-1 - wetten?
p.drawText(20,560,s2); ....
Jedes "ö" wird mit zwei Zeichen dargestellt bei der Ausgabe und eben nicht als "ö".
Eben. Du gibst in deinem Editor Umlaute in ISO-8859 ein, in deinem Qt-Programm aber mit Unicode / UTF-8 aus. Das KANN nicht gehen.
Andere Textausgaben funktionieren ohne Probleme auf diese Art und Weise, eben nur keine Umlaute!
Klar. Daß die 128 Zeichen, die sie selber brauchen, einfach immer funktionieren, dafür haben die Amis mit dem uralten ASCII-Code schon gesorgt - aber der hat eben nur 7 Bit, alles über Zeichen Nr. 127 ist undefiniert. Alle (üblichen) anderen Codierungen sind nur Erweiterungen von ASCII, d.h. [a-zA-Z0-9] und gebräuchliche Sonderzeichen (".,;/()[]{}...") sind eh immer gleich - aber eben nicht landesspezifische Sonderzeichen wie Umlaute. Um nicht nur hier in Mitteleuropa auf der Insel der Seligen zu leben, haben wir (SuSE) vor einigen Distributionen das System-Encoding auf UTF-8 umgestellt - dann kann dir auch der Kollege aus Prag eine Mail schicken, und du siehst seinen Namen richtig mit allen Sonderzeichen, die es in ISO-8859-1 (oder -15, das ist mehr oder weniger das gleiche nur mit Euro-Zeichen drin) eben nicht gibt. In Mittel- und Westeuropa hatten wir vorher üblicherweise ISO-8859-1, in Osteuropa ISO-8859-2. Dort, wo bei uns die Umlaute sind, sind bei den Nachbarn im Osten eben diverse Zeichen mit Akzenten, die es in Westeuropa eben nicht gibt. Das heißt, daß man beides gleichzeitig mit dieser Methode nicht darstellen kann. Deshalb eben der Umstieg auf UTF-8. Auch das ist zu ASCII aufwärtskompatibel, d.h. Zeichen unter 128 sind auch hier gleich. Bei Zeichen über 128 gibt es aber Steuersequenzen, die anzeigen, daß hier eben noch mehr Bytes kommen, die das gleiche Zeichen beschreiben - und so wird aus einem "ö" eben ein "obacht, hier kommt was Komisches" und dann ein "ö" - oder zumindest so in der Art. Das hat auch noch den Nebeneffekt, daß man damit auch Schriftzeichen von Sprachen darstellen kann, die so richtig anständig viele davon haben - chinesisch, japanisch, koreanisch. Und auch ganz andere, die mit ASCII nichts gemeinsam haben, wie kyrillisch oder griechisch. Damit kann man jetzt auch Spam von dort richtig schick dargestellt sehen, auch wenn man es nach wie vor nicht lesen kann, weil man eben die Sprache nicht versteht. ;-)
Woran kann das liegen? Wie kann man dieses Problem lösen?
Solche Meldungen mußt du explizit vom verwendeten Encoding nach Unicode konvertieren - das verwendet Qt intern. Wenn du sicher bist, daß du dein System richtig konfiguriert hast und auch dein Editor das System-Encoding verwendet: http://doc.trolltech.com/3.3/qstring.html#fromLocal8Bit QString::fromLocal8Bit( "Hällö Wölt!" ); Aber ich habe das Gefühl, daß du deinen Editor fest auf ISO-8859-? eingestellt hast, dann kann das auch in die Hose gehen. In diesem Fall solltest du lieber explizit von ISO-8859-1 (Latin-1) nach Unicode konvertieren: http://doc.trolltech.com/3.3/qstring.html#fromLatin1 QString::fromLatin1( "Hällö Wölt!" ); Dazu sei noch angemerkt, daß das eigentlich auch nur Glückssache ist, weil TrollTech selber eben auch in Norwegen und damit im Bereich des Westeuropäischen Encodings sitzt. Eine Funktion QString::fromLatin2() gibt es nämlich z.B. nicht. Haben wir's gut... ;-)
Habe auch das Buch:"Das QT Buch", 2.Auflage von Helmut Herold. Dort auf Seite 263 ist das Programm:"printerinfo.cpp", welches mit einer s.sprintf -Anweisung unter anderem das Wort:" Seitenverhältnis" ausgeben soll. Dieses Programm gibt bei mir auch den Umlaut "ä" nicht aus, sondern dafür wieder 2 andere Zeichen. Kann es sein, dass man bei meinem Suse-System irgend etwas, irgend wo einstellen oder ändern muss? Und wenn ja, was und wo und wie?
Du willst das nicht am System verstellen. Wirklich nicht. Wenn du das tust,
wirst du dir sehr viel mehr Probleme einhandeln, als du jetzt hast.
Und du willst ja vielleicht auch, daß man dein Programm benutzen kann, ohne
Systemeinstellungen zu verändern!
Übrigens: Im Profi-Bereich hat man dieses Problem gar nicht erst, weil die
Originalmeldungen im Programm in Englisch geschrieben werden (also ASCII, und
das geht immer, dafür sorgen die Amis schon) und Übersetzungen - und darunter
fällt natürlich auch deutsch - mit GNU gettext oder Qt::tr() von externen
Files geladen werden, in denen explizit drinsteht, in welcher Codierung die
Zeichen sind, so daß automatisch umcodiert werden kann.
Willkommen in der wunderbaren Welt der Internationalisierung.
;-)
CU
--
Stefan Hundhammer
Hallo, Am Fri, 20 May 2005, Stefan Hundhammer schrieb:
Willkommen in der wunderbaren Welt der Internationalisierung. ;-)
*LOL* Schoene Zusammenfassung ;) -dnh -- Irix is about as stable as a one-legged drunk with hypothermia in a four- hundred mile wind, balancing on a banana peel on a greased cookie sheet. When someone throws him an elephant with bad breath and a worse temper. --Simon Cozens in the scary devil monastery
Peter Wabersich schrieb:
s2.sprintf("Höööööhe (neuer Test) in mm: %d",789 ); p.drawText(20,560,s2); ....
Jedes "ö" wird mit zwei Zeichen dargestellt bei der Ausgabe und eben nicht als "ö". Andere Textausgaben funktionieren ohne Probleme auf diese Art und Weise, eben nur keine Umlaute! Woran kann das liegen? Wie kann man dieses Problem lösen?
Das sieht so aus, als ob Du den Quelltext UTF-8 codiert gespeichert hast (ist bei SuSE seit einiger Zeit default), die sprintf-Funktion aber ISO-8859-1 erwartet. Allerdings kenne ich mich mit Qt nicht aus, da müsstest Du wohl mal in die Doku schauen. -- Tilman Schmidt t.schmidt@phoenixsoftware.de Phoenix Software GmbH Tel. +49 228 97199 0 Adolf-Hombitzer-Str. 12 Fax +49 228 97199 99 53227 Bonn, Germany http://www.phoenixsoftware.de
On Friday 20 May 2005 14:04, Tilman Schmidt wrote:
Das sieht so aus, als ob Du den Quelltext UTF-8 codiert gespeichert hast
Uh - so herum kann es natürlich auch sein.
Dann nimmt man
http://doc.trolltech.com/3.3/qstring.html#fromUtf8
QString::fromUtf8( "Hällö, Wörld" );
CU
--
Stefan Hundhammer
Vielen Dank für die Beiträge, ich konnte Aufgrund der Hinweise und Vorschläge mein Problem lösen. Die Lösung sieht so aus und funktioniert auch: Code-Auszug: QString s7; s7.sprintf("Schöne Umlaute: ÖÄÜ, öäü"); p.drawText(20,580, QString::fromUtf8(s7) ); Ich wusste nicht, dass es entscheidend sein kann, in welcher Art und Weise der verwendete Editor kodiert. Aber in diesem Fall, ist dies entscheidend, denn in dessen Abhängigkeit muss man dann den Zeichensatz codieren unter Qt. Ich habe als Editor unter anderem KDevelop benutzt, ohne dort irgend welche großartigen Einstellungen zu verändern. Dort findet man unter Einstellungen->Editor-Einstellungen->Öffnen/Speichern, folgende Informationen: Öffnen und Speichern von Dateien: Dateiformat: Kodierung: Unicode (utf8) Zeilenende: Unix Ohne es zu wissen, habe ich also Unicode (utf8) verwendet, dementsprechend musste ich auch die Umwandlung: QString::fromUtf8 ( const char * utf8, int len = -1 ) verwenden. Returns the Unicode string decoded from the first len bytes of utf8, ignoring the rest of utf8. If len is -1 then the length of utf8 is used. If len is bigger than the length of utf8 then it will use the length of utf8. Wenn man eine Datei unter KDevelop öffnet, hat man auch noch die Möglichkeit den Zeichensatz der entsprechenden Datei zu ändern, denn ganz oben rechts, wird der verwendete angezeigt, bei mir: utf8, mit der Möglichkeit, einen anderen einzustellen. Da ich bei diesen Einstellungen grundsätzlich nichts verändert hatte, habe ich wie gesagt, immer utf8 verwendet, ohne diesem Zustand bisher große Aufmerksamkeit zu schenken. Von nun ab, werde ich dem verwendetem Zeichensatz immer meine Aufmerksamkeit zuteil werden lassen, insbesonders bei Programmierarbeiten. Unabhängig davon, weil mich das Problem so genervt hat, habe ich mir mal die Sache unter Windows XP angeschaut. QString s7=QString("ÄÖÜ, äöüß"); //Eingabe unter XP, Visuall C++ 6.0 ,geht p.drawText(20,620,s7); QString s33; s33.sprintf("Hööööööööööhe (neuer Test) in mm: %d",789); //von Programmer's File Editor unter XP,geht p.drawText(20,580,s33); Es wurden an Visuall C++ 6.0 und an Programmer's File Editor keinerlei Änderungen durchgeführt und obige Zeilen funktionierten sofort, mit der gewünschten Ausgabe, d.h., die Umlaute werden richtig dargestellt. Der verwendete Zeichensatz war bei beiden Programmen: Western (ISO-8859-1). Wünschen würde ich mir persönlich, das diese Problematik in den Programmierbüchern zu Qt erscheinen würde und zwar beim ersten Kapitel, beim ersten Programm. Denn bereits hier arbeitet man mit einem Editor, der einen bestimmten Zeichensatz benützt, der beachtet werden muss. Ich habe bereits mit drei verschiedenen Büchern zu Qt gearbeitet, um in die Programmierung unter Qt einzusteigen und in keinem wird diese Problematik erwähnt. Bei den englischen Büchern würde ich das ja noch verstehen, aber bei den deutschen Büchern, kann ich das nicht nachvollziehen, da wir nun mal die Umlaute in unsere Sprache haben und die entsprechende Problematik demzufolge auch behandelt werden muss. Ich hoffe, das dieser Beitrag dazu dient, zum einen, diese Problematik bekannt zu machen und zum anderen, eine Lösungsmöglichkeit bietet, damit andere Benützer, die in die Programmiersprache Qt einsteigen wollen, besonders unter Linux, nicht von diesem Problem betroffen werden, dessen Lösung mich schon einiges an Zeit und Nerven gekostet hat 8-) . In diesem Sinne, nochmals Danke, an alle, die zur Lösungsfindung beigetragen haben und fröhliches programmieren auch weiterhin, denn das nächste Problem kommt bestimmt. Mit freundlichen Grüßen Peter Wabersich Stefan Hundhammer schrieb:
On Friday 20 May 2005 14:04, Tilman Schmidt wrote:
Das sieht so aus, als ob Du den Quelltext UTF-8 codiert gespeichert hast
Uh - so herum kann es natürlich auch sein.
Dann nimmt man
http://doc.trolltech.com/3.3/qstring.html#fromUtf8
QString::fromUtf8( "Hällö, Wörld" );
CU
participants (4)
-
David Haller
-
Peter Wabersich
-
Stefan Hundhammer
-
Tilman Schmidt