UnicodeEncodeError bei QStrings mit nicht-ASCII-Zeichen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Maxx
User
Beiträge: 4
Registriert: Mittwoch 12. Juli 2006, 18:18

Ich habe ein kleines Skript zum Auslesen des aktuellen Lieds aus Amarok via DCOP geschrieben:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from kdecore import KApplication
import dcopext

app = KApplication(sys.argv, "NowPlaying")
player = dcopext.DCOPObj("amarok", app.dcopClient(), "player")

isPlaying = player.isPlaying()[1]
song = player.nowPlaying()[1]
album =player.album()[1]

if (isPlaying):
    print song
    print album
Klappt auch soweit alles, außer wenn Songtitel, Interpret oder Album (Zurück zum Glück) Zeichen enthält, die nicht im ASCII-Zeichensatz sind:

Code: Alles auswählen

[~/bin]>python nowplaying.py
Die Toten Hosen - Goldener Westen
Traceback (most recent call last):
  File "nowplaying.py", line 16, in ?
    print album
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 3: ordinal not in range(128)
.encode() oder .decode() lassen sich nicht benutzen, weil die Variablen QStrings sind.
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Probier mal stdout bzw in umzuschreiben(gerold hat dazu ein Tutorial geschrieben)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Maxx hat geschrieben:.encode() oder .decode() lassen sich nicht benutzen, weil die Variablen QStrings sind.
Hi Maxx!

Das könnte dir evt. weiter helfen: http://www.python-forum.de/topic-105.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Maxx
User
Beiträge: 4
Registriert: Mittwoch 12. Juli 2006, 18:18

OK,. werd ich ausprobieren. Hab jetzt gerade keine Zeit, wollte nur mal kurz nachgucken.

Danke.

edit: So gehts:

Code: Alles auswählen

def qstring2string(qstring):
    return str(qstring.local8Bit())
Stefan1975
User
Beiträge: 2
Registriert: Sonntag 28. September 2008, 19:59

Hallo,

hab

Code: Alles auswählen

 def qstring2string(qstring):
    return str(qstring.local8Bit())
probiert, aber es kommt nur eine Fehlermeldung:
return str(qstring.local8Bit())
AttributeError: local8Bit

habe

Code: Alles auswählen

 from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import * 
eingebunden. Das sollte ja richtig sein und
gleich sein mit

Code: Alles auswählen

 from qt import * 
was ich wo anders gesehen habe.
Der aufruf erfolgt durch

Code: Alles auswählen

FreeSpace = qstring2string(self.txt_GB.text())
.

Hat jemand eine Idee woran es liegt
oder wie man noch QString in String wandeln kann?

System Debian, Python 2.4.4, Python QT 4.0.1-5

mfg
Stefan
lunar

Code: Alles auswählen

ENCODING = sys.stdout.encoding or sys.getfilesystemencoding()
print unicode(qstring).encode(ENCODING)
Im Übrigen ist DCOP nicht mehr Bestandteil von KDE 4, und somit wirst du auch nicht Qt 4 nutzen, um Amarok über DCOP anzusprechen. In KDE 4 ist DCOP durch DBus ersetzt worden.

Auch ist "from qt import *" keinesfalls äquivalent zu "from PyQt4 import QtCore, QtGui". Ersteres importiert Qt 3, letzteres Qt 4. Dazwischen liegen Welten, und beide Module sind auch keinesfalls kompatibel!

Ich denke, dir fehlt diesbezüglich noch ein wenig Grundlagenlektüre.
Stefan1975
User
Beiträge: 2
Registriert: Sonntag 28. September 2008, 19:59

Danke erstmal,

ja stimmt bin noch totaler Anfänger bei Pyhton, dritter Tag.

Naja mag sein das es bei KDE 4 nicht mehr unterstützt wird, nutze GNOME.
Also funktioniert die Software auf einem KDE 4 System nicht und man müsste die
mit Qt3 umschreiben oder wie?

mfg

Stefan
lunar

Stefan1975 hat geschrieben:Naja mag sein das es bei KDE 4 nicht mehr unterstützt wird, nutze GNOME.
Du nutzt offenbar Amarok, und der nutzt nun mal die KDE-Bibliotheken. Also bist du mehr oder weniger auch davon betroffen.
Also funktioniert die Software auf einem KDE 4 System nicht und man müsste die mit Qt3 umschreiben oder wie?
Nein. Dein Code-Stück funktioniert prima mit Amarok 1.x, welcher die KDE 3 Bibliotheken und folglich DCOP nutzt. Dagegen nutzt Amarok 2 die KDE 4-Bibliotheken und folglich DBus, so dass dein Snippet mit Amarok 2 nicht mehr funktionieren wird.

Dieser Unterschied sollte dich allerdings erst stören, wenn deine Distribution Amarok 2 ausliefert, was bis jetzt ja offenbar nicht der Fall ist. Was ja auch verständlich ist, da Amarok 2 bis jetzt nur als Beta existiert.
Keranie
User
Beiträge: 9
Registriert: Dienstag 31. März 2015, 09:01

Hallo,
ich bekomme diesen Fehler:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 3: ordinal not in range(128)

Ich denke es liegt daran, dass einige Überschriften der Columns so angezeigt werden:
Papierm�hle
... sollten natürlich so sein "Papiermühle" oder zu mindest "Papiermuehle".
Ich dachte es geht wenn ich encoding = 'latin' verwede:
pd.read_csv((file),index_col=0, sep=';', header=0, encoding='latin1')
aber anscheinend nicht.. kann mir jemand weiterhelfen?
BlackJack

@Keranie: Die erste Frage ist in welcher Kodierung die Eingabedaten vorliegen, die muss man dann auch beim Einlesen angeben.

Die nächste Frage ist bei welcher Aktion genau Du den *En*code-Fehler bekommst, denn der kann ja eher nicht vom einlesen kommen, denn da wird *de*kodiert. Und an *der* Stelle musst Du dann vernünftig mit Unicode umgehen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hui... ein so alter Thread mit Gerold... da werden Erinnerungen wach :-)

@Keranie: Bist Du sicher, dass Du diesen Thread wiedereröffnen wolltest? Also geht es bei Dir wirklich auch um ``QStrings``? Oder hast Du nur ein "allgemeines" Standard-Encoding-Problem. Wie immer weise ich mal auf meine Signatur hin ;-) Die Links solltest Du Dir auf jeden Fall mal ansehen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Keranie
User
Beiträge: 9
Registriert: Dienstag 31. März 2015, 09:01

@Hyperion

ja war vllt der falsche thread ;-)
Hat sich auf jedenfall durch die Signatur gekärt. Danke :)
Antworten