Seite 1 von 1

Unicode Text aus QString bekommen

Verfasst: Samstag 7. August 2010, 00:52
von Dorsai!
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?

Re: Unicode Text aus QString bekommen

Verfasst: Samstag 7. August 2010, 06:05
von 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.

Re: Unicode Text aus QString bekommen

Verfasst: Samstag 7. August 2010, 09:56
von Dorsai!
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...

Re: Unicode Text aus QString bekommen

Verfasst: Samstag 7. August 2010, 13:11
von 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()

Re: Unicode Text aus QString bekommen

Verfasst: Samstag 7. August 2010, 17:38
von Dorsai!
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!

Re: Unicode Text aus QString bekommen

Verfasst: Samstag 7. August 2010, 18:08
von BlackJack
@Dorsai!: Ups, hatte ich ganz übersehen, dass das Widget selbst auch schon eine `toPlainText()`-Methode hat. Die funktioniert bei mir aber auch problemlos.

Re: Unicode Text aus QString bekommen

Verfasst: Samstag 7. August 2010, 19:31
von Dorsai!
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.