Seite 1 von 1

UnicodeEncodeError bei QStrings mit nicht-ASCII-Zeichen

Verfasst: Mittwoch 12. Juli 2006, 18:25
von Maxx
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.

Verfasst: Mittwoch 12. Juli 2006, 20:13
von CrackPod
Probier mal stdout bzw in umzuschreiben(gerold hat dazu ein Tutorial geschrieben)

Re: UnicodeEncodeError bei QStrings mit nicht-ASCII-Zeichen

Verfasst: Mittwoch 12. Juli 2006, 20:51
von gerold
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
:-)

Verfasst: Donnerstag 13. Juli 2006, 08:29
von Maxx
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())

Verfasst: Sonntag 28. September 2008, 20:47
von Stefan1975
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

Verfasst: Sonntag 28. September 2008, 21:01
von 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.

Verfasst: Sonntag 28. September 2008, 21:41
von Stefan1975
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

Verfasst: Sonntag 28. September 2008, 21:46
von 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.

Re: UnicodeEncodeError bei QStrings mit nicht-ASCII-Zeichen

Verfasst: Dienstag 21. April 2015, 12:07
von Keranie
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?

Re: UnicodeEncodeError bei QStrings mit nicht-ASCII-Zeichen

Verfasst: Dienstag 21. April 2015, 13:02
von 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.

Re: UnicodeEncodeError bei QStrings mit nicht-ASCII-Zeichen

Verfasst: Dienstag 21. April 2015, 18:08
von Hyperion
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.

Re: UnicodeEncodeError bei QStrings mit nicht-ASCII-Zeichen

Verfasst: Mittwoch 22. April 2015, 08:52
von Keranie
@Hyperion

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