Mailinglist Archive: opensuse-programming-de (71 mails)
| < Previous | Next > |
Re: Kann unter Qt mit Suse 9.2 keine Umlaute ausgeben.
- From: Stefan Hundhammer <sh@xxxxxxx>
- Date: Fri, 20 May 2005 12:06:09 +0200
- Message-id: <200505201206.09944.sh@xxxxxxx>
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 <qpainter.h>
> #include <stdlib.h> //für sprintf
> #include <qstring.h> //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 <sh@xxxxxxx> Penguin by conviction.
YaST2 Development
SUSE Linux Products GmbH
Nuernberg, Germany
> 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 <qpainter.h>
> #include <stdlib.h> //für sprintf
> #include <qstring.h> //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 <sh@xxxxxxx> Penguin by conviction.
YaST2 Development
SUSE Linux Products GmbH
Nuernberg, Germany
| < Previous | Next > |