Hi,
habe gerade auf einem Screenshot gesehen, dass bei meinem Programm auf einem Rechner aus Japan das ° und das µ - Zeichen nicht richtig dargestellt werden. Bei mir funktionierts natürlich. Was mach ich falsch?
foo = new QLabel("°C");
Sonderzeichen in anderen Ländern
-
maikelmeyers
- Beiträge: 20
- Registriert: 16. Mai 2010 17:19
-
maikelmeyers
- Beiträge: 20
- Registriert: 16. Mai 2010 17:19
in meiner main-Funktion habe ich Folgendes stehen:
QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
Damit hatte ich schonmal erreicht, dass das ° -Zeichen unter Linux überhaupt richtig angezeigt wird.
Wenn man das manual von QTextCodec::setCodecForCStrings mal anschaut steht da auch ein Hinweis zu Japan.
void QTextCodec::setCodecForCStrings ( QTextCodec * codec ) [static]
Sets the codec used by QString to convert to and from const char * and QByteArrays. If the codec is 0 (the default), QString assumes Latin-1.
Warning: Some codecs do not preserve the characters in the ASCII range (0x00 to 0x7F). For example, the Japanese Shift-JIS encoding maps the backslash character (0x5A) to the Yen character. To avoid undesirable side-effects, we recommend avoiding such codecs with setCodecsForCString().
Heißt das jetzt es wäre besser das hier zu schreiben:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
damit das hier auf allen Rechnern korrekt funktioniert?
foo = new QLabel("°C");
Ich kapier das mit den Codecs nicht so ganz. Ich dachte immer, dass sich Qt automatisch darum kümmert, dass alle Zeichen auf jedem Rechner korrekt angezeigt werden, wegens interner Verarbeitung mit Unicode.
tr() benutzt man doch soweit ich das mitbekommen habe nur, damit zur Laufzeit verschiedene Texte in verschiedenen Sprachen je nach Systemumgebung ausgegeben werden.
QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
Damit hatte ich schonmal erreicht, dass das ° -Zeichen unter Linux überhaupt richtig angezeigt wird.
Wenn man das manual von QTextCodec::setCodecForCStrings mal anschaut steht da auch ein Hinweis zu Japan.
void QTextCodec::setCodecForCStrings ( QTextCodec * codec ) [static]
Sets the codec used by QString to convert to and from const char * and QByteArrays. If the codec is 0 (the default), QString assumes Latin-1.
Warning: Some codecs do not preserve the characters in the ASCII range (0x00 to 0x7F). For example, the Japanese Shift-JIS encoding maps the backslash character (0x5A) to the Yen character. To avoid undesirable side-effects, we recommend avoiding such codecs with setCodecsForCString().
Heißt das jetzt es wäre besser das hier zu schreiben:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
damit das hier auf allen Rechnern korrekt funktioniert?
foo = new QLabel("°C");
Ich kapier das mit den Codecs nicht so ganz. Ich dachte immer, dass sich Qt automatisch darum kümmert, dass alle Zeichen auf jedem Rechner korrekt angezeigt werden, wegens interner Verarbeitung mit Unicode.
tr() benutzt man doch soweit ich das mitbekommen habe nur, damit zur Laufzeit verschiedene Texte in verschiedenen Sprachen je nach Systemumgebung ausgegeben werden.
Ist ja auch Unicode - wenn es einmal in einem QString drin ist. Dein Problem ist das "reinkriegen". Die Zeichenkette in den "..." liegt in einem(!) bestimmten Encoding in Deinem Quelltext. Der Compiler packt die Zeichen dann in der Regel 1:1 in das Binary. Zur _Laufzeit_ wird jetzt aus denen ein QString aufgebaut. Das Encoding ist aber durch das Encoding der Textdatei mit Deinem Quelltext festgelegt. Insofern ist
QTextCodec::codecForName("UTF-8") oder direkt QString::fromUtf8("°C")
schon mal besser als codecForLocale oder fromLocal8Bit, da letztere ja von den Nutzereinstellungen zur Laufzeit abhaengen, und der Nutzer keinen Einfluss auf das Quellcodeencoding hat.
Mit UTF-8 sollte es gehen, das fliegt Dir allerdings um die Ohren, wenn jemand auf die Idee kommt, die Sourcen vor dem Kompileren umzukodieren, z.B. weil er noch ein Latin1 basiertes System hat und das schicker findet. Das Problem kann man auch noch vermeiden, wenn man seine Quellen auf 7 bit ASCII beschraenkt, auch wenn das weniger lesbar ist:
QString s = QChar(0xb0); // degree sign
s += "C";
oder sogar
QString s = QChar(0x2103); // DEGREE CELSIUS
QTextCodec::codecForName("UTF-8") oder direkt QString::fromUtf8("°C")
schon mal besser als codecForLocale oder fromLocal8Bit, da letztere ja von den Nutzereinstellungen zur Laufzeit abhaengen, und der Nutzer keinen Einfluss auf das Quellcodeencoding hat.
Mit UTF-8 sollte es gehen, das fliegt Dir allerdings um die Ohren, wenn jemand auf die Idee kommt, die Sourcen vor dem Kompileren umzukodieren, z.B. weil er noch ein Latin1 basiertes System hat und das schicker findet. Das Problem kann man auch noch vermeiden, wenn man seine Quellen auf 7 bit ASCII beschraenkt, auch wenn das weniger lesbar ist:
QString s = QChar(0xb0); // degree sign
s += "C";
oder sogar
QString s = QChar(0x2103); // DEGREE CELSIUS
-
maikelmeyers
- Beiträge: 20
- Registriert: 16. Mai 2010 17:19
Ah, jetzt kapier ich das so langsam. Danke.
Aber etwas ist mir immer noch unklar.
Komischerweise werden die C-Strings bei mir unter WindowsXP in Latin1 im Quelltext kodiert und unter Linux in UTF8. Selbst wenn ich unter Windows im Qt Creator als Umgebungsencoding UTF8 einstelle, funktioniert es nicht, dass das Grad-Zeichen richtig angezeigt wird, sofern ich QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); benutze.
Offensichtlich muss in der Funktion setCodecForCStrings als Parameter das Encoding des Entwicklungssystems stehen. Wie könnte man denn das Encoding des Entwicklungssystems rausfinden? Sozusagen PreProcessor-artig, damit das Ganze auf jedem System, auf dem das Programm kompiliert wird funktioniert?
Aber etwas ist mir immer noch unklar.
Von welchem Encoding geht denn der QChar-Konstruktor aus, wenn er 0xb0 in Unicode wandelt? In Latin8 z.B. wäre das kein Grad-Zeichen.grog hat geschrieben: QString s = QChar(0xb0); // degree sign
Komischerweise werden die C-Strings bei mir unter WindowsXP in Latin1 im Quelltext kodiert und unter Linux in UTF8. Selbst wenn ich unter Windows im Qt Creator als Umgebungsencoding UTF8 einstelle, funktioniert es nicht, dass das Grad-Zeichen richtig angezeigt wird, sofern ich QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); benutze.
Offensichtlich muss in der Funktion setCodecForCStrings als Parameter das Encoding des Entwicklungssystems stehen. Wie könnte man denn das Encoding des Entwicklungssystems rausfinden? Sozusagen PreProcessor-artig, damit das Ganze auf jedem System, auf dem das Programm kompiliert wird funktioniert?
Der QChar-Konstruktor setzt direkt 16 bit Daten, ist also de facto UCS-2 (also "knapp" UTF-16). QString ist intern UTF-16, damit macht der QChar-Konstruktor hier genau was Du brauchst, um den QChar an den String anhaengen zu koennen.
Im Prinzip muesste QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); immer funktionieren, wenn alle Deine Quellen UTF-8 sind, und Deine Projekt-Einstellungen im Creator "UTF-8" sagen. Ich vermute mal, dass sich in eine Deiner Quelldateien ein Latin1-Zeichen eingeschmuggelt hat.
Im Prinzip muesste QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); immer funktionieren, wenn alle Deine Quellen UTF-8 sind, und Deine Projekt-Einstellungen im Creator "UTF-8" sagen. Ich vermute mal, dass sich in eine Deiner Quelldateien ein Latin1-Zeichen eingeschmuggelt hat.
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
-
maikelmeyers
- Beiträge: 20
- Registriert: 16. Mai 2010 17:19