qt4 QString Probleme mit Darstellung von Umlauten

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
dut42
User
Beiträge: 4
Registriert: Mittwoch 24. Juli 2019, 16:02

Hallo,

Ich hab da mal ein Problem mit der Darstellung von Umlauten, die sich in einem QString befinden:

Code: Alles auswählen

        mein_string = "örtlicher Ähnlichkeitenübergang"  

        mein_qstring = QtCore.QString("örtlicher Ähnlichkeitenübergang#è")         
        print(mein_string.decode("utf-8"))
        print(mein_qstring.toUtf8())   
        meinstring = str(QtCore.QString("ä").toUtf8())
        print("meinstring {}".format(meinstring))
als Erläuterung:

mein_string wird korrekt dargestellt.
mein_qstring enthält statt der Umlaute kryptische Zeichen.

Warum ist das so? bzw. wie kann ich dafür sorgen, dass diese Sonderzeichen auch korrekt dargestellt werden?
Viele Grüße

d u t
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Welche Python-Version?
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@__deets__: Na Python 2, sonst hätte `mein_string` keine `decode()`-Methode. :-)

@dut42: Fang gar nicht erst mit Python 2 an.

Edit: Ansonsten schau doch einfach mal in der Qt-Dokumention nach. `QString` mit einer Byte-Zeichenkette aufgerufen ist demnach das gleiche wie `QString.fromAscii()`. Und bei der Methode steht dann das der Name etwas irreführend ist, weil die zum Dekodieren das nimmt was mit `QTextCodec::setCodecForCStrings()` gesetzt wurde. Wenn da nichts gesetzt wurde, verhält sich die Methode wie `QString.fromLatin1()`. Die Methode macht was der Name suggeriert. Wenn die Byte-Zeichenkette also nicht Latin-1 kodiert ist, dann gibt's Buchstabensalat.

Lösung: Python 3 verwenden, da sind Zeichenketten Unicode und keine Bytes und die Qt-Anbindung frisst eigentlich überall auch gleich Python-Zeichenketten ohne das man die vorher in explizit in `QString` umwandeln muss.
Zuletzt geändert von __blackjack__ am Mittwoch 24. Juli 2019, 17:02, insgesamt 1-mal geändert.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Pah. Details.
dut42
User
Beiträge: 4
Registriert: Mittwoch 24. Juli 2019, 16:02

__deets__ hat geschrieben: Mittwoch 24. Juli 2019, 16:18 Welche Python-Version?
2.7.und qt4
dut42
User
Beiträge: 4
Registriert: Mittwoch 24. Juli 2019, 16:02

__blackjack__ hat geschrieben: Mittwoch 24. Juli 2019, 16:56 @__deets__: Na Python 2, sonst hätte `mein_string` keine `decode()`-Methode. :-)

@dut42: Fang gar nicht erst mit Python 2 an.

Edit: Ansonsten schau doch einfach mal in der Qt-Dokumention nach. `QString` mit einer Byte-Zeichenkette aufgerufen ist demnach das gleiche wie `QString.fromAscii()`. Und bei der Methode steht dann das der Name etwas irreführend ist, weil die zum Dekodieren das nimmt was mit `QTextCodec::setCodecForCStrings()` gesetzt wurde. Wenn da nichts gesetzt wurde, verhält sich die Methode wie `QString.fromLatin1()`. Die Methode macht was der Name suggeriert. Wenn die Byte-Zeichenkette also nicht Latin-1 kodiert ist, dann gibt's Buchstabensalat.

Lösung: Python 3 verwenden, da sind Zeichenketten Unicode und keine Bytes und die Qt-Anbindung frisst eigentlich überall auch gleich Python-Zeichenketten ohne das man die vorher in explizit in `QString` umwandeln muss.
Leider habe ich sehr viel Code "geerbt" und wollte nicht alles von Grund auf neu machen bzw. Anfassen müssen, daher wollte ich bei python 2 für die Geschichte bleiben. :(

Setcodeforcstrings - - > da müsste ich dann utf8 einstellen?
dut42
User
Beiträge: 4
Registriert: Mittwoch 24. Juli 2019, 16:02

Quark also explizit "latin-1" setzen.... Es ist warm sorry
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt nur unicode-Strings benutzen.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und über das mit Python 3 noch mal überlegen weil: https://pythonclock.org/

Qt4 ist auch nicht mehr wirklich taufrisch. Der Umstieg von Qt4 auf Qt5 ist nicht so schwer.

Bei Python kann man mit Hilfe von `six` oder `future` auch erst einmal einen Zwischenschritt einlegen der dann unter beiden Versionen läuft, wenn man keinen harten Schnitt machen will. Obwohl es dafür eigentlich schon ein bisschen spät ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Kirikkayis
User
Beiträge: 85
Registriert: Freitag 18. Januar 2019, 08:02

Hey,

hatte das selbe Problem nur wars bei mir Qt5 :)

Versuch doch mal bitte folgendes:

Code: Alles auswählen

mein_string = trUtf8("örtlicher Ähnlichkeitenübergang");
Bei mir hat das mit dem
.decode("utf-8")
auch nicht funktioniert.
Die obere Methode funktioniert bei mir, zumindest in Qt5.
Antworten