Als erstes stellt sich die Frage ob `input` bei Dir wirklich UTF-8 kodiert ist. Das kann man bei Deinem Beispiel nicht sehen. Wenn ich das nämlich einfach so bei mir in die Python-Shell eintippe, dann ist sind die Zeichen 'Ã' und '©' bei der Eingabe als UTF-8 kodiert und nicht die UTF-8 Kodierung für ein 'é':
Code: Alles auswählen
In [16]: a = 'Café De La Plage'
In [17]: print repr(a)
'Caf\xc3\x83\xc2\xa9 De La Plage'
In [18]: b = a.decode('utf-8')
In [19]: print repr(b)
u'Caf\xc3\xa9 De La Plage'
In [20]: print b
Café De La Plage
Bei ``print`` muss aus der Unicode Zeichenkette wieder eine Byte-Zeichenkette gemacht werden, dazu wird geschaut welche Kodierung in `sys.stdout.encoding` steht. Bei mir ist das UTF-8, darum sieht auch die Ausgabe so aus.
Bei Deiner ersten Zuweisung kann es sich nicht im UTF-8 handeln weil bei Deinem ``print`` zwei Sachen deutlich werden: 1. wird versucht die Unicode Zeichenkette als cp850 zu kodieren, sieht also nach DOS/Eingabeaufforderung aus, und 2. enthält die Unicode Zeichenkette ein grosses N mit einem Accent Grave. Das Zeichen gibt's in der cp850 Kodierung nicht, darum kracht's.
Was ist passiert? Du hast eine cp850 kodierte Zeichenkette versucht als UTF-8 zu dekodieren. Meine Eingaben sind UTF-8 kodiert, darum kodiere ich das zum Testen erstmal in cp850 um:
Code: Alles auswählen
In [21]: c = 'Café De La Plage'.decode('utf-8').encode('cp850')
In [22]: c.decode('utf-8').encode('cp850')
---------------------------------------------------------------------------
exceptions.UnicodeEncodeError Traceback (most recent call last)
/home/marc/<ipython console>
/usr/lib/python2.4/encodings/cp850.py in encode(self, input, errors)
16 def encode(self,input,errors='strict'):
17
---> 18 return codecs.charmap_encode(input,errors,encoding_map)
19
20 def decode(self,input,errors='strict'):
UnicodeEncodeError: 'charmap' codec can't encode character u'\u01f8' in position 3: character maps to <undefined>
In [23]: import unicodedata
In [24]: unicodedata.name(u'\u01f8')
Out[24]: 'LATIN CAPITAL LETTER N WITH GRAVE'