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