Seite 1 von 1

Problem in Modul "calendar"

Verfasst: Montag 10. August 2009, 13:15
von snafu
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?

Verfasst: Montag 10. August 2009, 13:55
von cofi
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 ;)

Verfasst: Montag 10. August 2009, 13:56
von Trundle
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.

Verfasst: Montag 10. August 2009, 14:11
von snafu
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))

Verfasst: Montag 10. August 2009, 14:54
von snafu
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))