Problem in Modul "calendar"

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hi,

sollte man dies als Bug oder als Feature ansehen:

Code: Alles auswählen

In [1]: import calendar

In [2]: cal = calendar.HTMLCalendar()

In [3]: with open('test.html', 'w') as f:
   ...:     f.write(cal.formatyear(2009, 8))
   ...:     
   ...:     

In [4]: cal = calendar.LocaleHTMLCalendar()

In [5]: with open('test.html', 'w') as f:
    f.write(cal.formatyear(2009, 8))
   ...:     
   ...:     
---------------------------------------------------------------------------
UnicodeEncodeError                        Traceback (most recent call last)

/home/sebastian/<ipython console> in <module>()

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 2588: ordinal not in range(128)
Letzteres nutzt als Locale bei mir Deutsch und wird wahrscheinlich mit dem März nicht klarkommen. Sollte man dieses Verhalten als gewollt ansehen oder ist das ein Fehler?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

IMHO gewollt. Der Fehler tritt ja nicht beim erstellen auf, da ``unicode`` Objekte benutzt werden, sondern beim Schreiben.
Da in Python2.x das Standardencoding ASCII ist, krachts natuerlich.

Bleibt nur ``codecs.open`` oder ein explizites Kodieren ;)
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Das ist kein Fehler. Die Dokumentation sagt zu `calendar.LocaleHTMLCalendar`: "If this locale includes an encoding all strings containing month and weekday names will be returned as unicode." Du bekommst also Unicode zurück und musst dich beim Speichern in die Datei dann selber um das Enkodieren kümmern.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Danke euch. Habe es so gemacht:

Code: Alles auswählen

with codecs.open('test.html', 'w', 'iso-8859-1') as f:
    f.write(cal.formatyear(2009))
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich hab die Klasse mal so erweitert, dass sie beim Schreiben in eine Datei mit dem Encoding klar kommt:

Code: Alles auswählen

from calendar import LocaleHTMLCalendar, TimeEncoding
import codecs

class MyHTMLCalendar(LocaleHTMLCalendar):

    def write(self, s, filename='calendar.html'):
        with TimeEncoding(self.locale) as encoding:
            with codecs.open(filename, 'w', encoding) as f:
                f.write(s)

def test():
    cal = MyHTMLCalendar()
    cal.write(cal.formatyear(2009))
Antworten