Umlaute - Die Verzweilfung

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
huehnerhose
User
Beiträge: 6
Registriert: Montag 6. September 2010, 18:36

Hallo!

Ich muss jetzt wirklich einen Thread starten, da ich seit Stunden keine funktionierende Lösung finde:

Meine Umlaute in der GUI werden falsch angezeigt... Es sieht nach einem typischen encoding Problem aus...
Ich habe inzwischen so ziemlich alles was ich gefunden habe drin... also:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4.uic.Compiler.qtproxies import QtCore

QtCore.QTextCodec.setCodecForTr(QtCore.QTextCodec.codecForName("UTF-8"))
QtCore.QTextCodec.setCodecForLocale(QtCore.QTextCodec.codecForName("UTF-8"))
QtCore.QTextCodec.setCodecForCStrings(QtCore.QTextCodec.codecForName("UTF-8"))
Ein print "äöü" funktioniert wunderbar, nur eben in den Qt-Widgets funktioniert es nicht. Meine Dateien sind 100% UTF-8 gespeichert

Code: Alles auswählen

UIClasses$ file -i *
UILagerinformationen.py: text/x-java; charset=utf-8
UILagertabelle.py:       text/x-java; charset=utf-8
UIMainView.py:           text/x-java; charset=utf-8
UIWiderstand.py:         text/x-java; charset=utf-8
Mein System läuft auch auf UTF-8 als Grund (ubuntu)... ich bin echt ratlos...

Danke für jede Hilfe
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

und so etwas funktioniert?:

Code: Alles auswählen

label_mit_umlaute = QtGui.QLabel(u"äöü")
Bei mir zeigt es bei folgendem Skript das obere Label falsch an, das untere korrekt:

Code: Alles auswählen

# -*- coding: utf-8 -*-

from PyQt4 import QtGui

class SetSelectionTestDlg(QtGui.QDialog):

    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        layout = QtGui.QVBoxLayout()
        label = QtGui.QLabel("äöü")
        label_mit_umlaute = QtGui.QLabel(u"äöü")
        layout.addWidget(label)
        layout.addWidget(label_mit_umlaute)
        self.setLayout(layout)

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    sstd = SetSelectionTestDlg()
    result = sstd.exec_()
huehnerhose
User
Beiträge: 6
Registriert: Montag 6. September 2010, 18:36

ehmm... ja... wenn ich das "u" davor schreibe funktioniert es :shock:

Was genau macht das??? Ich bin gerade sehr verwirrt
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das macht den String zu einem Unicode Literal.
Genauso wie

Code: Alles auswählen

"äüö".decode("utf-8")
ein Unicode-Objekt auswirft. PyQt konvertiert Unicode-Objekte automatisch so, dass sie richtig angezeigt werden. Bei Byte-Strings (ohne `u`) kann man allerdings nicht darauf schliessen, in welcher Kodierung sie vorliegen, also geht das in die Hose.
huehnerhose
User
Beiträge: 6
Registriert: Montag 6. September 2010, 18:36

Achso ok... soweit erstmal schon vielen Dank!

Dann bleibt nur die Frage ob ich ihn "zwingen" kann davon auszugehen, dass alles was an Byte-Strings da ist utf-8-kodiert ist?

Aber sehe ich das richtig, dass dann Daten, die ich aus einer sqlite DB hole, sofern ich irgendwo bei der DB oder dem Hanlder dafür die Kodierung angeben kann, die Sachen dann auch entsprechend angezeigt werden ohne dass ich sie mit u anzeigen muss?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Was das erzwingen angeht: Dazu kann ich grad nichts sagen, evtl. muesstest du da mal die PyQt Doku durchgehn.

Ad Sqlite, AFAIK gibt das Unicode-Objekte fuer `TEXT` Felder zurueck. Das `u` gilt nur fuer Literale, also Strings die du direkt in den Quelltext schreibst, sonstige Konvertierung `str->unicode` muss per `str.decode` erfolgen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
lunar

@huehnerhose: Nun, da Du sie kennst, wieso beharrst Du auf Bytestrings, und verwendest nicht einfach Unicode-Literale? Das u vor jeder Zeichenkette bringt Dich schon nicht um, erspart aber all die Gedanken über Kodierungen. Ab Python 2.6 kannst Du zudem mit "from __future__ import unicode_literals" auch dafür sorgen, dass Zeichenkettenliterale ohne "u" ebenfalls als Unicode-Literale interpretiert werden.

Darf man übrigens fragen, wo zum Teufel Du den Import "from PyQt4.uic.Compiler.qtproxies import QtCore" her hast?!
huehnerhose
User
Beiträge: 6
Registriert: Montag 6. September 2010, 18:36

@lunar: das mit dem u ist vollkommen ok, ich wollte nur sicher gehen, dass ich das Problem nicht mit Eingaben aus der UI habe bzw. mit Daten aus der Datenbank. Und hauptsächlich habe ich gedacht irgendwo Murks an sich drin zu haben und deswegen das Problem überhaupt zu bekommen
Was das "from PyQt4.uic.Compiler.qtproxies import QtCore" angeht... ich benutze seit einger Zeit Eclipse als Entwicklungsumgebung allgemein und fand dann PyDev und das meint dass das ein kluger import wäre... aber ich habe schon an mehreren Stellen jetzt merken müssen, dass PyDev nicht so verlässlich ist wie z.B. die Java-Umgebung von Eclipse. Besonders was Obejektbeschreibungen angeht. Leider finde ich auch die Reference für PyQt die ich gefunden habe nicht sooo gut, da die Beispiele halt alle die C/C++ Beispiele sind und die Adaption durch mangelnde Kenntnis schwer fällt und ich darin auch teilweise Attribute nicht gefunden habe. (Speziell die clicked Geschichte hat mich da einiges gekostet)

@Hyperion: Den ersten Link hatte ich voher bereits gelesen, aber durch die richtige Konsolenanzeige die Geschichte mit dem u nicht wahrgenommen.
Antworten