Conky über python script ohna umlt. (gelöst)

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
sarbot
User
Beiträge: 5
Registriert: Mittwoch 4. September 2013, 14:50

Hey,

Hintergründe:
Ich habe schon etwas Erfahrung mit Python (kaum mit conky) und bin gerade dabei mir mein Desktop als persönliche Infozentrale einzurichten. Dies soll von systemdaten (cpu, mem, network, syslog ... ) über Wetter, Kalender, Todolisten, bis hin zum Speiseplan der Unimensa, Rss feeds und viel mehr.
Mit Websites parsen hab ich kaum Erfahrung, bin mit der Dokumentation von BeautifulSoup aber ganz einfach voran gekommen. Da ich keine Ahnung von LUA oder Conky habe, formatiere ich die strings komplett im python-script, sodass die Ausgabe conky anweisungen sind (script von conky ausgeführt mit execp). Da stoße ich aber auf Probleme mit der Codierung. Ein Thema um das ich mich gern versuche herumzumogeln ;).



Problem:
Mein Script gibt utf-8 (!?) codierte strings aus. In der Konsole werden mir Umlaute (ö, ä, ü) richtig angezeigt conky lehnt diese aber ab. Starte ich die conkyrc über die konsole bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/lukas/Dropbox/projekte/conky/mensa/mensa.py", line 50, in <module>
    print "${font Ubuntu:size=9,weight:normal}${color}" + essen[i][1]
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 94: ordinal not in range(128)
Das es sich um ein Problem mit der codierung der umlaute handelt ist mir sowieso klar, da conky den output jedes scripts auch nur bis zur ersten Zeile die ein Umlaut beinhalten würde darstellt.
Unicode, ascii, utf-8 alles begriffe die ich schon 100 mal gehört und benutzt habe aber über die ich nicht wirklich bescheid weiß. Ich mutmaße mal das u'\xf6' ein Umlaut ist und u'' für unicode steht (?). Ich hatte eigentlich erwartet, dass mein output utf-8 codiert ist.
Wegen:

Code: Alles auswählen

# -*- coding: utf-8 -*-
...
parse = BeautifulSoup(src.content.decode('utf-8', 'ignore'))
...
string = parse.find(id="id").get_string()
print  " { ... } " + string
das ich die strings in listen schreibe um sie mit schleifen auszulesen sollte für die codierung keine rolle spielen oder ? Wie sieht das mit addieren von strings aus?

in meiner conkyrc steht folgendes:

Code: Alles auswählen

...
override_utf8_locale yes
use_xft yes
xftfont caviar dreams:size=8
...
TEXT
...
${execp python /path/mensa.py}
...
das override_utf8 ist mir erst beim schreiben aufgefallen ich werde gleich nachlesen was es damit auf sich hat. Muss ich Conky sagen wie es diese Codierung zu entschlüsseln hat, oder meinem script sagen wie es den output zu formatieren hat? (beides müsste möglich sein, aber was ist in diesem fall der übliche ansatz)
Ist dies vielleicht ein problem der schriftart ? wobei ubuntu (schriftart) ja eigentlich umlaute beinhaltet.
Zuletzt geändert von sarbot am Montag 12. Januar 2015, 01:46, insgesamt 1-mal geändert.
sarbot
User
Beiträge: 5
Registriert: Mittwoch 4. September 2013, 14:50

wenn ich die den quellcode complett mit

Code: Alles auswählen

src.contents.decode('ascii','ignore')
Einlese verschwinden die umlaute, aber wenigstens wird der folgende Text angezeigt. So könnts zur Not bleiben, eine Substitution der Chars durch ae usw wäre sicherlich auch denkbar. Aber ein Workaround kompromiss den ich eig. nicht eingehen will. Wenn ich in der conkyrc umlaute benutze werden sie ja auch angezeigt.
sarbot
User
Beiträge: 5
Registriert: Mittwoch 4. September 2013, 14:50

Wieder mal typisch. Den lieben langen Tag sieht man den Wald for lauter bäumen nicht und dann wenn man alles aufschreibt und seine Gedanken sortiert löst sich das problem von selbst.

Der outputstring muss einfach nur wieder encoded werden. Da am anfang mit .decode(utf-8) eingelesen wurde. Muss die ausgabe entsprechend mit .encode('UTF-8') versehen werden. Dann funktionierts und conky zeigt nun meine ganzen Umlaute an.
Thema gelöst. Irgendwie schaffe ichs bei codierungen immer wieder mich selbst maximal zu verwirren.
Antworten