Unicode Text aus QString bekommen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Dorsai!
User
Beiträge: 7
Registriert: Mittwoch 4. August 2010, 21:12

Hintergrund:
Ich habe ein QtextEdit Widget und versuche den Text den ich davon durch die Methode toPlainText() in eine Textdatei zu schreiben.
Dieser Text kann im Widget auch Zeichen wie "ö" oder Japanische Zeichen enthalten.

Ich dachte mir:

Code: Alles auswählen

>>> t = QString("öööö")
>>> tt = str(t)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-7: ordinal not in range(128)
:roll:
"Na klar, ist ja auch ein unicode string und kein 0815 String!"

Code: Alles auswählen

>>> tt = unicode(t)
>>> print tt
öööö
:K
:idea:
"Vielleicht gehts ja so!"

Code: Alles auswählen

>>> ttt = tt.decode("utf-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.6/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-7: ordinal not in range(128)
:shock:

Was mache ich falsch?
BlackJack

@Dorsai!: Dein Problem ist hier nicht das Umwandeln von einem `QString` in ein `unicode`-Objekt sondern schon mit welchen Daten Du das `QString`-Exemplar erstellst. Das machst Du ja mit einem Bytestring und zwar ohne anzugeben in welcher Kodierung der eigentlich ist. Keine Ahnung welche `QString` da annimmt, aber es ist offentlichtlich nicht die Richtige. Erstelle den `QString` besser mit 'ö's von denen Du weisst, das es auch tatsächlich 'ö's sind -- also mit einem `unicode`-Objekt.
Dorsai!
User
Beiträge: 7
Registriert: Mittwoch 4. August 2010, 21:12

Du hast recht. Wenn ich meine "ööö"s erst mit utf-8 decode, bevor ich sie in den QString packe, dann geht es.
Leider aber nur im interpreter, nicht aber in meiner Anwendung, da bekomm ich den QString ja aus einem QtextEdit Widget.

Heißt das dann, dass mir mein QtextEdit gar keine unicode QStrings liefert? Ich dachte immer alle QStrings wären automatisch Unicode.
Ich finde auch in den Docs keine Möglichkeit das encoding von dem QtextEdit zu ändern.

Fakt ist:
-Ich gebe verschiedene Zeichen in das Textfenster, die es zusammen in keinem ASCII Encoding gibt sondern nur in utf-8 aufwärts.
-Ich kann den qstring den ich bekomme weder mit unicode() noch mit str() nutzbar machen.

Die Ratlosigkeit ist daher jetzt eher noch größer...
BlackJack

@Dorsai!: Ein `QTextEdit` sollte Dir eigentlich Unicode liefern können. Kannst Du mal ein minimales Beispiel basteln was das Problem zeigt!?

Edit: Ich habe mal ein Minimalbeispiel gebastelt und das funktioniert bei mir:

Code: Alles auswählen

from PyQt4.QtCore import QObject, QString, SIGNAL
from PyQt4.QtGui import (
    QApplication, QHBoxLayout, QWidget, QPushButton, QTextEdit
)


def main():
    application = QApplication(list())
    
    def do_action():
        text = unicode(text_edit.document().toPlainText())
        print repr(text)
    
    widget = QWidget()
    text_edit = QTextEdit(widget)
    button = QPushButton('Action', widget)
    QObject.connect(button, SIGNAL('clicked()'), do_action)
    hbox = QHBoxLayout(widget)
    hbox.addWidget(text_edit)
    hbox.addWidget(button)
    widget.show()
    application.exec_()


if __name__ == '__main__':
    main()
Dorsai!
User
Beiträge: 7
Registriert: Mittwoch 4. August 2010, 21:12

Das Problem war wie ich den Text abgerufen habe:

Code: Alles auswählen

text = unicode(text_edit.toPlainText())
statt

Code: Alles auswählen

text = unicode(text_edit.document().toPlainText())
Das hat auch wunderbar funktioniert, nur eben nur mit ascii Zeichen.


Jetzt funktioniert es wunderbar. Danke dir!
BlackJack

@Dorsai!: Ups, hatte ich ganz übersehen, dass das Widget selbst auch schon eine `toPlainText()`-Methode hat. Die funktioniert bei mir aber auch problemlos.
Dorsai!
User
Beiträge: 7
Registriert: Mittwoch 4. August 2010, 21:12

Also bei mir jetzt auch.

Der Interpreter hat aber vorher eindeutig diese Zeile:

Code: Alles auswählen

content = unicode(self.ui.textEdit.toPlainText())
mit so einem ascii encode error (wie der in meinem ersten post) angegeben.

Vermutlich habe ich den eigentlichen Fehler jetzt durch die ganze herum Probiererei behoben.
Antworten